XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_spi.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_spi.h"
15
16#if XF_HAL_SPI_IS_ENABLE
17
18#include "../kernel/xf_hal_dev.h"
19
20/* ==================== [Defines] =========================================== */
21
22#define TAG "hal_spi"
23#define XF_HAL_SPI_TYPE XF_HAL_SPI
24
25/* ==================== [Typedefs] ========================================== */
26
27typedef struct _xf_hal_spi_t {
28 xf_hal_dev_t dev; // 一定要放到第一个,以便后续close一起free
31
32/* ==================== [Static Prototypes] ================================= */
33
35
36/* ==================== [Static Variables] ================================== */
37
38/* ==================== [Macros] ============================================ */
39
40#define XF_HAL_SPI_CHECK(condition, retval, format, ...) \
41 XF_CHECK(condition, retval, TAG, format, ##__VA_ARGS__)
42
43/* ==================== [Global Functions] ================================== */
44
49
51{
52 xf_err_t err = XF_OK;
53 UNUSED(err);
54
56 XF_HAL_SPI_CHECK(!dev, XF_ERR_NOT_FOUND, "spi init failed!");
57
58 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
59
60#if XF_HAL_LOCK_IS_ENABLE
61 xf_lock_lock(dev_spi->dev.mutex);
62#endif
63
64 dev_spi->config.hosts = hosts;
65 dev_spi->config.speed = speed;
66
67#if XF_HAL_LOCK_IS_ENABLE
68 xf_lock_unlock(dev_spi->dev.mutex);
69#endif
70
72 XF_HAL_SPI_CHECK(err, err, "enable failed!");
73
74 return XF_OK;
75}
76
78{
79 xf_err_t err = XF_OK;
80 UNUSED(err);
81
83 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
84 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
85
86 err = xf_hal_driver_close(dev);
87 XF_HAL_SPI_CHECK(err, err, "deinit failed!");
88
89 return XF_OK;
90}
91
93{
94 xf_err_t err = XF_OK;
95 UNUSED(err);
96
98 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
99 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
100
101#if XF_HAL_LOCK_IS_ENABLE
102 xf_lock_lock(dev_spi->dev.mutex);
103#endif
104
105 dev_spi->config.enable = true;
106
107#if XF_HAL_LOCK_IS_ENABLE
108 xf_lock_unlock(dev_spi->dev.mutex);
109#endif
110
111 err = xf_hal_driver_ioctl(dev, XF_HAL_SPI_CMD_ENABLE, &dev_spi->config);
112 XF_HAL_SPI_CHECK(err, err, "spi set enable failed!");
113
114 return XF_OK;
115}
116
118{
119 xf_err_t err = XF_OK;
120 UNUSED(err);
121
123 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
124 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
125
126#if XF_HAL_LOCK_IS_ENABLE
127 xf_lock_lock(dev_spi->dev.mutex);
128#endif
129
130 dev_spi->config.enable = false;
131
132#if XF_HAL_LOCK_IS_ENABLE
133 xf_lock_unlock(dev_spi->dev.mutex);
134#endif
135
136 err = xf_hal_driver_ioctl(dev, XF_HAL_SPI_CMD_ENABLE, &dev_spi->config);
137 XF_HAL_SPI_CHECK(err, err, "spi set enable failed!");
138
139 return XF_OK;
140}
141
143{
144 xf_err_t err = XF_OK;
145 UNUSED(err);
146
148 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
149 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
150
151#if XF_HAL_LOCK_IS_ENABLE
152 xf_lock_lock(dev_spi->dev.mutex);
153#endif
154
155 dev_spi->config.prev_cb.callback = callback;
156 dev_spi->config.prev_cb.user_data = user_data;
157
158#if XF_HAL_LOCK_IS_ENABLE
159 xf_lock_unlock(dev_spi->dev.mutex);
160#endif
161
163 XF_HAL_SPI_CHECK(err, err, "spi set enable failed!");
164
165 return XF_OK;
166}
167
169{
170 xf_err_t err = XF_OK;
171 UNUSED(err);
172
174 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
175 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
176
177#if XF_HAL_LOCK_IS_ENABLE
178 xf_lock_lock(dev_spi->dev.mutex);
179#endif
180
181 dev_spi->config.post_cb.callback = callback;
182 dev_spi->config.post_cb.user_data = user_data;
183
184#if XF_HAL_LOCK_IS_ENABLE
185 xf_lock_unlock(dev_spi->dev.mutex);
186#endif
187
189 XF_HAL_SPI_CHECK(err, err, "spi set enable failed!");
190
191 return XF_OK;
192}
193
195{
196 xf_err_t err = XF_OK;
197 UNUSED(err);
198
200 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
201 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
202
203#if XF_HAL_LOCK_IS_ENABLE
204 xf_lock_lock(dev_spi->dev.mutex);
205#endif
206
207 dev_spi->config.gpio = *spi_gpio;
208
209#if XF_HAL_LOCK_IS_ENABLE
210 xf_lock_unlock(dev_spi->dev.mutex);
211#endif
212
213 err = xf_hal_driver_ioctl(dev, XF_HAL_SPI_CMD_GPIO, &dev_spi->config);
214 XF_HAL_SPI_CHECK(err, err, "spi set gpio failed!");
215
216 return XF_OK;
217}
218
220{
221 xf_err_t err = XF_OK;
222 UNUSED(err);
223
225 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
226 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
227
228#if XF_HAL_LOCK_IS_ENABLE
229 xf_lock_lock(dev_spi->dev.mutex);
230#endif
231
232 dev_spi->config.bit_order = bit_order;
233
234#if XF_HAL_LOCK_IS_ENABLE
235 xf_lock_unlock(dev_spi->dev.mutex);
236#endif
237
239 XF_HAL_SPI_CHECK(err, err, "spi set bit order failed!");
240
241 return XF_OK;
242}
243
245{
246 xf_err_t err = XF_OK;
247 UNUSED(err);
248
250 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
251 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
252
253#if XF_HAL_LOCK_IS_ENABLE
254 xf_lock_lock(dev_spi->dev.mutex);
255#endif
256
257 dev_spi->config.mode = mode;
258
259#if XF_HAL_LOCK_IS_ENABLE
260 xf_lock_unlock(dev_spi->dev.mutex);
261#endif
262
263 err = xf_hal_driver_ioctl(dev, XF_HAL_SPI_CMD_MODE, &dev_spi->config);
264 XF_HAL_SPI_CHECK(err, err, "spi set mode failed!");
265
266 return XF_OK;
267}
268
270{
271 xf_err_t err = XF_OK;
272 UNUSED(err);
273
275 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
276 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
277
278#if XF_HAL_LOCK_IS_ENABLE
279 xf_lock_lock(dev_spi->dev.mutex);
280#endif
281
282 dev_spi->config.data_width = data_width;
283
284#if XF_HAL_LOCK_IS_ENABLE
285 xf_lock_unlock(dev_spi->dev.mutex);
286#endif
287
289 XF_HAL_SPI_CHECK(err, err, "spi set data width failed!");
290
291 return XF_OK;
292}
293
295{
296 xf_err_t err = XF_OK;
297 UNUSED(err);
298
300 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
301 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
302
303#if XF_HAL_LOCK_IS_ENABLE
304 xf_lock_lock(dev_spi->dev.mutex);
305#endif
306
307 dev_spi->config.speed = speed;
308
309#if XF_HAL_LOCK_IS_ENABLE
310 xf_lock_unlock(dev_spi->dev.mutex);
311#endif
312
313 err = xf_hal_driver_ioctl(dev, XF_HAL_SPI_CMD_SPEED, &dev_spi->config);
314 XF_HAL_SPI_CHECK(err, err, "spi set speed failed!");
315
316 return XF_OK;
317}
318
319int xf_hal_spi_write(xf_spi_num_t spi_num, const uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
320{
321 xf_err_t err = XF_OK;
322 UNUSED(err);
323
325 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
326 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
327
328 if (dev_spi->config.timeout_ms != timeout_ms) {
329
330#if XF_HAL_LOCK_IS_ENABLE
331 xf_lock_lock(dev_spi->dev.mutex);
332#endif
333
334 dev_spi->config.timeout_ms = timeout_ms;
335
336#if XF_HAL_LOCK_IS_ENABLE
337 xf_lock_unlock(dev_spi->dev.mutex);
338#endif
339
341 XF_HAL_SPI_CHECK(err, err, "set timeout_ms failed!");
342 }
343
344 err = xf_hal_driver_write(dev, buffer, size);
345 XF_HAL_SPI_CHECK(err < XF_OK, err, "spi write failed!:%d!", -err);
346
347 return err;
348}
349
350int xf_hal_spi_read(xf_spi_num_t spi_num, uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
351{
352 xf_err_t err = XF_OK;
353 UNUSED(err);
354
356 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)dev;
357 XF_HAL_SPI_CHECK(!dev_spi, XF_ERR_UNINIT, "spi is not init!");
358
359 if (dev_spi->config.timeout_ms != timeout_ms) {
360#if XF_HAL_LOCK_IS_ENABLE
361 xf_lock_lock(dev_spi->dev.mutex);
362#endif
363
364 dev_spi->config.timeout_ms = timeout_ms;
366 XF_HAL_SPI_CHECK(err, err, "set timeout_ms failed!");
367
368#if XF_HAL_LOCK_IS_ENABLE
369 xf_lock_unlock(dev_spi->dev.mutex);
370#endif
371 }
372
373 err = xf_hal_driver_read(dev, buffer, size);
374 XF_HAL_SPI_CHECK(err < XF_OK, err, "spi read failed!:%d!", -err);
375
376 return err;
377}
378
379/* ==================== [Static Functions] ================================== */
380
382{
383 xf_err_t err = XF_OK;
384 UNUSED(err);
385 xf_hal_dev_t *dev = NULL;
386 xf_hal_spi_t *dev_spi = (xf_hal_spi_t *)xf_malloc(sizeof(xf_hal_spi_t));
387 XF_ASSERT(dev_spi, NULL, TAG, "memory alloc failed!");
388
389 dev = (xf_hal_dev_t *)dev_spi;
390
391 err = xf_hal_driver_open(dev, XF_HAL_SPI_TYPE, spi_num);
392
393 if (err) {
394 XF_LOGE(TAG, "open failed!");
395 xf_free(dev);
396 dev = NULL;
397 }
398
399 return dev;
400}
401
402#endif
xf_err_t xf_hal_spi_enable(xf_spi_num_t spi_num)
spi 启用函数。
Definition xf_hal_spi.c:92
xf_err_t xf_hal_spi_set_mode(xf_spi_num_t spi_num, xf_hal_spi_mode_t mode)
设置 spi 模式。
Definition xf_hal_spi.c:244
enum _xf_hal_spi_bit_order_t xf_hal_spi_bit_order_t
spi 传输位顺序。
int xf_hal_spi_write(xf_spi_num_t spi_num, const uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
spi 写入数据函数。
Definition xf_hal_spi.c:319
void(* xf_hal_spi_cb_t)(xf_spi_num_t spi_num, void *user_data)
spi 回调函数原型。
Definition xf_hal_spi.h:53
xf_err_t xf_hal_spi_set_gpio(xf_spi_num_t spi_num, const xf_hal_spi_gpio_t *spi_gpio)
设置 spi 的输出 io。
Definition xf_hal_spi.c:194
xf_err_t xf_hal_spi_disable(xf_spi_num_t spi_num)
spi 禁用函数。
Definition xf_hal_spi.c:117
enum _xf_hal_spi_hosts_t xf_hal_spi_hosts_t
spi 的主从模式。
enum _xf_hal_spi_mode_t xf_hal_spi_mode_t
spi 模式。
uint32_t xf_spi_num_t
spi 序号。
Definition xf_hal_spi.h:43
xf_err_t xf_hal_spi_set_data_width(xf_spi_num_t spi_num, xf_hal_spi_data_width_t data_width)
设置 spi 的传输数据宽度。
Definition xf_hal_spi.c:269
int xf_hal_spi_read(xf_spi_num_t spi_num, uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
spi 读取数据函数。
Definition xf_hal_spi.c:350
xf_err_t xf_hal_spi_set_post_cb(xf_spi_num_t spi_num, xf_hal_spi_cb_t callback, void *user_data)
设置 spi 传输后回调。
Definition xf_hal_spi.c:168
xf_err_t xf_hal_spi_set_speed(xf_spi_num_t spi_num, uint32_t speed)
设置 spi 的传输速度。
Definition xf_hal_spi.c:294
xf_err_t xf_hal_spi_init(xf_spi_num_t spi_num, xf_hal_spi_hosts_t hosts, uint32_t speed)
spi 初始化函数。
Definition xf_hal_spi.c:50
enum _xf_hal_spi_data_width_t xf_hal_spi_data_width_t
spi 传输数据位宽。
xf_err_t xf_hal_spi_set_prev_cb(xf_spi_num_t spi_num, xf_hal_spi_cb_t callback, void *user_data)
设置 spi 传输前回调。
Definition xf_hal_spi.c:142
xf_err_t xf_hal_spi_set_bit_order(xf_spi_num_t spi_num, xf_hal_spi_bit_order_t bit_order)
设置 spi 输出的字节序。
Definition xf_hal_spi.c:219
xf_err_t xf_hal_spi_deinit(xf_spi_num_t spi_num)
spi 反初始化函数。
Definition xf_hal_spi.c:77
@ XF_HAL_SPI_CMD_DATA_WIDTH
Definition xf_hal_spi.h:128
@ XF_HAL_SPI_CMD_TIMEOUT
Definition xf_hal_spi.h:129
@ XF_HAL_SPI_CMD_MODE
Definition xf_hal_spi.h:127
@ XF_HAL_SPI_CMD_PREV_CB
Definition xf_hal_spi.h:132
@ XF_HAL_SPI_CMD_SPEED
Definition xf_hal_spi.h:130
@ XF_HAL_SPI_CMD_GPIO
Definition xf_hal_spi.h:131
@ XF_HAL_SPI_CMD_POST_CB
Definition xf_hal_spi.h:133
@ XF_HAL_SPI_CMD_BIT_ORDER
Definition xf_hal_spi.h:126
@ XF_HAL_SPI_CMD_ENABLE
Definition xf_hal_spi.h:125
@ XF_HAL_SPI_CMD_HOSTS
Definition xf_hal_spi.h:124
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NOT_FOUND
Definition xf_err.h:50
@ XF_ERR_UNINIT
Definition xf_err.h:54
int xf_lock_unlock(xf_lock_t lock)
解锁.
Definition xf_lock.c:88
int xf_lock_lock(xf_lock_t lock)
锁定直至成功.
Definition xf_lock.c:72
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
xf_hal_spi_cb_t callback
Definition xf_hal_spi.h:59
用于对接 SPI 设置的参数。
Definition xf_hal_spi.h:169
xf_hal_spi_callback_t post_cb
Definition xf_hal_spi.h:182
xf_hal_spi_callback_t prev_cb
Definition xf_hal_spi.h:181
xf_hal_spi_gpio_t gpio
Definition xf_hal_spi.h:180
spi 的引脚设置。
Definition xf_hal_spi.h:143
xf_hal_spi_config_t config
Definition xf_hal_spi.c:29
xf_hal_dev_t dev
Definition xf_hal_spi.c:28
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
int xf_hal_driver_read(xf_hal_dev_t *dev, void *buf, size_t count)
Definition xf_hal_dev.c:168
xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.c:154
xf_err_t xf_hal_driver_open(xf_hal_dev_t *dev, xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:118
int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.c:180
xf_hal_dev_t * xf_hal_device_find(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:238
xf_err_t xf_hal_driver_register(xf_hal_type_t type, xf_hal_flag_t flag, xf_hal_dev_create_t constructor, const xf_driver_ops_t *driver_ops)
Definition xf_hal_dev.c:44
xf_hal_dev_t * xf_hal_driver_create(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:93
@ XF_HAL_FLAG_READ_WRITE
Definition xf_hal_dev.h:54
#define XF_HAL_SPI_CHECK(condition, retval, format,...)
Definition xf_hal_spi.c:40
static xf_hal_dev_t * spi_constructor(xf_spi_num_t spi_num)
Definition xf_hal_spi.c:381
#define XF_HAL_SPI_TYPE
Definition xf_hal_spi.c:23
xf_err_t xf_hal_spi_register(const xf_driver_ops_t *driver_ops)
spi 设备注册。
Definition xf_hal_spi.c:45
struct _xf_hal_spi_t xf_hal_spi_t
#define TAG
Definition xf_hal_spi.c:22
xf_hal 的 spi(串行外设接口) 设备抽象。
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)