luat_spi.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. #ifndef LUAT_SPI_H
  2. #define LUAT_SPI_H
  3. #include "luat_base.h"
  4. /**
  5. * @defgroup luatos_device_spi SPI接口
  6. * @{
  7. */
  8. typedef struct luat_spi
  9. {
  10. int id; /**< spi id 可选 1,0*/
  11. int CPHA; /**< CPHA 可选 1,0*/
  12. int CPOL; /**< CPOL 可选 1,0*/
  13. int dataw; /**< 数据宽度 8:8bit */
  14. int bit_dict; /**< 高低位顺序 可选 1:MSB, 0:LSB */
  15. int master; /**< 设置主从模式 可选 1:主机, 0:从机 */
  16. int mode; /**< 设置全\半双工 可选 1:全双工,0:半双工 */
  17. int bandrate; /**< 频率 最小100000, 最大25600000*/
  18. int cs; /**< cs控制引脚 如果和硬件cs脚一致,则启用硬件cs功能,反之需要用户自行初始化成gpio功能来控制*/
  19. } luat_spi_t;
  20. typedef struct luat_spi_device
  21. {
  22. uint8_t bus_id;
  23. luat_spi_t spi_config;
  24. void* user_data;
  25. } luat_spi_device_t;
  26. typedef struct luat_fatfs_spi
  27. {
  28. uint8_t type;
  29. uint8_t spi_id;
  30. uint8_t spi_cs;
  31. uint8_t nop;
  32. uint32_t fast_speed;
  33. uint8_t transfer_buf[7];
  34. luat_spi_device_t * spi_device;
  35. }luat_fatfs_spi_t;
  36. typedef int (*luat_spi_irq_callback_t)(int spi_id, void *user_data);
  37. /**
  38. spiId,--spi id
  39. cs,
  40. 0,--CPHA
  41. 0,--CPOL
  42. 8,--数据宽度
  43. 20000000,--最大频率20M
  44. spi.MSB,--高低位顺序 可选,默认高位在前
  45. spi.master,--主模式 可选,默认主
  46. spi.full,--全双工 可选,默认全双工
  47. */
  48. /**
  49. * @brief 初始化配置SPI各项参数,并打开SPI
  50. *
  51. * @param spi spi结构体
  52. * @return int 成功返回0
  53. */
  54. int luat_spi_setup(luat_spi_t* spi);
  55. /**
  56. * @brief SPI收发数据尝试启动DMA模式
  57. *
  58. * @param spi_id spi id
  59. * @param tx_channel 发送通道
  60. * @param rx_channel 接收通道
  61. * @return int
  62. */
  63. int luat_spi_config_dma(int spi_id, uint32_t tx_channel, uint32_t rx_channel);
  64. /**
  65. * @brief 关闭SPI
  66. *
  67. * @param spi_id spi id
  68. * @return int 成功返回0
  69. */
  70. int luat_spi_close(int spi_id);
  71. /**
  72. * @brief 收发SPI数据
  73. *
  74. * @param spi_id spi id
  75. * @param send_buf 发送数据
  76. * @param send_length 发送数据长度
  77. * @param recv_buf 接收数据
  78. * @param recv_length 接收数据长度
  79. * @return int 返回接收字节数
  80. */
  81. int luat_spi_transfer(int spi_id, const char* send_buf, size_t send_length, char* recv_buf, size_t recv_length);
  82. /**
  83. * @brief 收SPI数据
  84. *
  85. * @param spi_id spi id
  86. * @param recv_buf 接收数据
  87. * @param length 数据长度
  88. * @return int 返回接收字节数
  89. */
  90. int luat_spi_recv(int spi_id, char* recv_buf, size_t length);
  91. /**
  92. * @brief 发SPI数据
  93. *
  94. * @param spi_id spi id
  95. * @param send_buf 发送数据
  96. * @param length 数据长度
  97. * @return int 返回发送字节数
  98. */
  99. int luat_spi_send(int spi_id, const char* send_buf, size_t length);
  100. /**
  101. * @brief SPI速率修改
  102. *
  103. * @param spi_id spi id
  104. * @param speed 速率
  105. * @return int 返回发送字节数
  106. */
  107. int luat_spi_change_speed(int spi_id, uint32_t speed);
  108. /**
  109. * @brief SPI收发数据(异步)
  110. *
  111. * @param spi_id spi id
  112. * @param tx_buff 发送数据
  113. * @param rx_buff 接收数据
  114. * @param len 数据长度
  115. * @param CB 回调函数
  116. * @param pParam 回调参数
  117. * @return int 返回发送字节数
  118. */
  119. int luat_spi_no_block_transfer(int spi_id, uint8_t *tx_buff, uint8_t *rx_buff, size_t len, void *CB, void *pParam);
  120. /**
  121. * @brief 设置从机SPI接收buf满回调函数,制定好SPI协议,尽量不要触发接收BUF满的中断
  122. *
  123. * @param spi_id spi id
  124. * @param callback 回调函数
  125. * @param user_data 用户数据
  126. * @return int 成功返回0,其他-1
  127. */
  128. int luat_spi_set_slave_callback(int spi_id, luat_spi_irq_callback_t callback, void *user_data);
  129. /**
  130. * @brief 收发从机SPI数据
  131. *
  132. * @param spi_id spi id
  133. * @param send_buf 发送数据
  134. * @param recv_buf 接收数据
  135. * @param recv_length 总缓冲区长度,不能大于8188
  136. * @return int 成功返回0,其他-1
  137. */
  138. int luat_spi_slave_transfer(int spi_id, const char* send_buf, char* recv_buf, size_t total_length);
  139. /**
  140. * @brief 从机SPI暂停工作,并返回已经接收的数据长度,不允许进入休眠状态
  141. *
  142. * @param spi_id spi id
  143. * @return int 成功返回本次接收长度,其他-1
  144. */
  145. int luat_spi_slave_transfer_pause_and_read_data(int spi_id);
  146. /**
  147. * @brief 在中断中收发从机SPI数据
  148. *
  149. * @param spi_id spi id
  150. * @param send_buf 发送数据
  151. * @param recv_buf 接收数据
  152. * @param recv_length 总缓冲区长度,不能大于8188
  153. * @return int 成功返回0,其他-1
  154. */
  155. int luat_spi_slave_fast_transfer_in_irq(int spi_id, const char* send_buf, char* recv_buf, size_t total_length);
  156. /**
  157. * @brief 在中断中从机SPI暂停工作,并返回已经接收的数据长度,不允许进入休眠状态
  158. *
  159. * @param spi_id spi id
  160. * @return int 成功返回本次接收长度,其他-1
  161. */
  162. int luat_spi_slave_transfer_fast_pause_and_read_data_in_irq(int spi_id);
  163. /**
  164. * @brief 从机SPI暂停工作,不允许进入休眠状态,在irq中使用
  165. *
  166. * @param spi_id spi id
  167. * @return int 成功返回0,其他-1
  168. */
  169. int luat_spi_slave_transfer_pause_in_irq(int spi_id);
  170. /**
  171. * @brief 从机SPI停止工作,并允许进入休眠状态
  172. *
  173. * @param spi_id spi id
  174. * @return int 成功返回0,其他-1
  175. */
  176. int luat_spi_slave_transfer_stop(int spi_id);
  177. /**
  178. * @brief SPI模式获取
  179. *
  180. * @param spi_id spi id
  181. * @return int 模式
  182. */
  183. int luat_spi_get_mode(int spi_id);
  184. /**
  185. * @brief SPI模式修改
  186. *
  187. * @param spi_id spi id
  188. * @param mode 模式
  189. * @return int 返回发送字节数
  190. */
  191. int luat_spi_set_mode(int spi_id, uint8_t mode);
  192. /**
  193. * @brief spi总线初始化
  194. *
  195. * @param spi_dev luat_spi_device_t 结构体
  196. * @return int
  197. */
  198. int luat_spi_bus_setup(luat_spi_device_t* spi_dev);
  199. /**
  200. * @brief spi设备初始化
  201. *
  202. * @param spi_dev luat_spi_device_t 结构体
  203. * @return int
  204. */
  205. int luat_spi_device_setup(luat_spi_device_t* spi_dev);
  206. /**
  207. * @brief spi设备配置
  208. *
  209. * @param spi_dev luat_spi_device_t 结构体
  210. * @return int
  211. */
  212. int luat_spi_device_config(luat_spi_device_t* spi_dev);
  213. /**
  214. * @brief spi设备关闭
  215. *
  216. * @param spi_dev luat_spi_device_t 结构体
  217. * @return int
  218. */
  219. int luat_spi_device_close(luat_spi_device_t* spi_dev);
  220. /**
  221. * @brief spi设备收发数据,返回接收字节数
  222. *
  223. * @param spi_dev luat_spi_device_t 结构体
  224. * @param send_buf 发送数据
  225. * @param send_length 发送数据长度
  226. * @param recv_buf 接收数据
  227. * @param recv_length 接收数据长度
  228. * @return int
  229. */
  230. int luat_spi_device_transfer(luat_spi_device_t* spi_dev, const char* send_buf, size_t send_length, char* recv_buf, size_t recv_length);
  231. /**
  232. * @brief spi设备接收数据,返回接收字节数
  233. *
  234. * @param spi_dev luat_spi_device_t 结构体
  235. * @param recv_buf 接收数据
  236. * @param length 数据长度
  237. * @return int 返回接收字节数
  238. */
  239. int luat_spi_device_recv(luat_spi_device_t* spi_dev, char* recv_buf, size_t length);
  240. /**
  241. * @brief spi设备发送数据,返回接收字节数
  242. *
  243. * @param spi_dev luat_spi_device_t 结构体
  244. * @param send_buf 发送数据
  245. * @param length 数据长度
  246. * @return int 返回发送字节数
  247. */
  248. int luat_spi_device_send(luat_spi_device_t* spi_dev, const char* send_buf, size_t length);
  249. /**
  250. * @brief 锁定SPI,只有主模式下才能使用,多个设备挂载在同一条总线上需要使用
  251. *
  252. * @param spi_id spi id
  253. * @return int 成功返回0,其他-1
  254. */
  255. int luat_spi_lock(int spi_id);
  256. /**
  257. * @brief 释放SPI,只有主模式下才能使用,多个设备挂载在同一条总线上需要使用
  258. *
  259. * @param spi_id spi id
  260. * @return int 成功返回0,其他-1
  261. */
  262. int luat_spi_unlock(int spi_id);
  263. /**@}*/
  264. #endif