| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- #ifndef LUAT_SPI_H
- #define LUAT_SPI_H
- #include "luat_base.h"
- /**
- * @defgroup luatos_device_spi SPI接口
- * @{
- */
- typedef struct luat_spi
- {
- int id; /**< spi id 可选 1,0*/
- int CPHA; /**< CPHA 可选 1,0*/
- int CPOL; /**< CPOL 可选 1,0*/
- int dataw; /**< 数据宽度 8:8bit */
- int bit_dict; /**< 高低位顺序 可选 1:MSB, 0:LSB */
- int master; /**< 设置主从模式 可选 1:主机, 0:从机 */
- int mode; /**< 设置全\半双工 可选 1:全双工,0:半双工 */
- int bandrate; /**< 频率 最小100000, 最大25600000*/
- int cs; /**< cs控制引脚 如果和硬件cs脚一致,则启用硬件cs功能,反之需要用户自行初始化成gpio功能来控制*/
- } luat_spi_t;
- typedef struct luat_spi_device
- {
- uint8_t bus_id;
- luat_spi_t spi_config;
- void* user_data;
- } luat_spi_device_t;
- typedef struct luat_fatfs_spi
- {
- uint8_t type;
- uint8_t spi_id;
- uint8_t spi_cs;
- uint8_t nop;
- uint32_t fast_speed;
- uint8_t transfer_buf[7];
- luat_spi_device_t * spi_device;
- }luat_fatfs_spi_t;
- typedef int (*luat_spi_irq_callback_t)(int spi_id, void *user_data);
- /**
- spiId,--spi id
- cs,
- 0,--CPHA
- 0,--CPOL
- 8,--数据宽度
- 20000000,--最大频率20M
- spi.MSB,--高低位顺序 可选,默认高位在前
- spi.master,--主模式 可选,默认主
- spi.full,--全双工 可选,默认全双工
- */
- /**
- * @brief 初始化配置SPI各项参数,并打开SPI
- *
- * @param spi spi结构体
- * @return int 成功返回0
- */
- int luat_spi_setup(luat_spi_t* spi);
- /**
- * @brief SPI收发数据尝试启动DMA模式
- *
- * @param spi_id spi id
- * @param tx_channel 发送通道
- * @param rx_channel 接收通道
- * @return int
- */
- int luat_spi_config_dma(int spi_id, uint32_t tx_channel, uint32_t rx_channel);
- /**
- * @brief 关闭SPI
- *
- * @param spi_id spi id
- * @return int 成功返回0
- */
- int luat_spi_close(int spi_id);
- /**
- * @brief 收发SPI数据
- *
- * @param spi_id spi id
- * @param send_buf 发送数据
- * @param send_length 发送数据长度
- * @param recv_buf 接收数据
- * @param recv_length 接收数据长度
- * @return int 返回接收字节数
- */
- int luat_spi_transfer(int spi_id, const char* send_buf, size_t send_length, char* recv_buf, size_t recv_length);
- /**
- * @brief 收SPI数据
- *
- * @param spi_id spi id
- * @param recv_buf 接收数据
- * @param length 数据长度
- * @return int 返回接收字节数
- */
- int luat_spi_recv(int spi_id, char* recv_buf, size_t length);
- /**
- * @brief 发SPI数据
- *
- * @param spi_id spi id
- * @param send_buf 发送数据
- * @param length 数据长度
- * @return int 返回发送字节数
- */
- int luat_spi_send(int spi_id, const char* send_buf, size_t length);
- /**
- * @brief SPI速率修改
- *
- * @param spi_id spi id
- * @param speed 速率
- * @return int 返回发送字节数
- */
- int luat_spi_change_speed(int spi_id, uint32_t speed);
- /**
- * @brief SPI收发数据(异步)
- *
- * @param spi_id spi id
- * @param tx_buff 发送数据
- * @param rx_buff 接收数据
- * @param len 数据长度
- * @param CB 回调函数
- * @param pParam 回调参数
- * @return int 返回发送字节数
- */
- int luat_spi_no_block_transfer(int spi_id, uint8_t *tx_buff, uint8_t *rx_buff, size_t len, void *CB, void *pParam);
- /**
- * @brief 设置从机SPI接收buf满回调函数,制定好SPI协议,尽量不要触发接收BUF满的中断
- *
- * @param spi_id spi id
- * @param callback 回调函数
- * @param user_data 用户数据
- * @return int 成功返回0,其他-1
- */
- int luat_spi_set_slave_callback(int spi_id, luat_spi_irq_callback_t callback, void *user_data);
- /**
- * @brief 收发从机SPI数据
- *
- * @param spi_id spi id
- * @param send_buf 发送数据
- * @param recv_buf 接收数据
- * @param recv_length 总缓冲区长度,不能大于8188
- * @return int 成功返回0,其他-1
- */
- int luat_spi_slave_transfer(int spi_id, const char* send_buf, char* recv_buf, size_t total_length);
- /**
- * @brief 从机SPI暂停工作,并返回已经接收的数据长度,不允许进入休眠状态
- *
- * @param spi_id spi id
- * @return int 成功返回本次接收长度,其他-1
- */
- int luat_spi_slave_transfer_pause_and_read_data(int spi_id);
- /**
- * @brief 在中断中收发从机SPI数据
- *
- * @param spi_id spi id
- * @param send_buf 发送数据
- * @param recv_buf 接收数据
- * @param recv_length 总缓冲区长度,不能大于8188
- * @return int 成功返回0,其他-1
- */
- int luat_spi_slave_fast_transfer_in_irq(int spi_id, const char* send_buf, char* recv_buf, size_t total_length);
- /**
- * @brief 在中断中从机SPI暂停工作,并返回已经接收的数据长度,不允许进入休眠状态
- *
- * @param spi_id spi id
- * @return int 成功返回本次接收长度,其他-1
- */
- int luat_spi_slave_transfer_fast_pause_and_read_data_in_irq(int spi_id);
- /**
- * @brief 从机SPI暂停工作,不允许进入休眠状态,在irq中使用
- *
- * @param spi_id spi id
- * @return int 成功返回0,其他-1
- */
- int luat_spi_slave_transfer_pause_in_irq(int spi_id);
- /**
- * @brief 从机SPI停止工作,并允许进入休眠状态
- *
- * @param spi_id spi id
- * @return int 成功返回0,其他-1
- */
- int luat_spi_slave_transfer_stop(int spi_id);
- /**
- * @brief SPI模式获取
- *
- * @param spi_id spi id
- * @return int 模式
- */
- int luat_spi_get_mode(int spi_id);
- /**
- * @brief SPI模式修改
- *
- * @param spi_id spi id
- * @param mode 模式
- * @return int 返回发送字节数
- */
- int luat_spi_set_mode(int spi_id, uint8_t mode);
- /**
- * @brief spi总线初始化
- *
- * @param spi_dev luat_spi_device_t 结构体
- * @return int
- */
- int luat_spi_bus_setup(luat_spi_device_t* spi_dev);
- /**
- * @brief spi设备初始化
- *
- * @param spi_dev luat_spi_device_t 结构体
- * @return int
- */
- int luat_spi_device_setup(luat_spi_device_t* spi_dev);
- /**
- * @brief spi设备配置
- *
- * @param spi_dev luat_spi_device_t 结构体
- * @return int
- */
- int luat_spi_device_config(luat_spi_device_t* spi_dev);
- /**
- * @brief spi设备关闭
- *
- * @param spi_dev luat_spi_device_t 结构体
- * @return int
- */
- int luat_spi_device_close(luat_spi_device_t* spi_dev);
- /**
- * @brief spi设备收发数据,返回接收字节数
- *
- * @param spi_dev luat_spi_device_t 结构体
- * @param send_buf 发送数据
- * @param send_length 发送数据长度
- * @param recv_buf 接收数据
- * @param recv_length 接收数据长度
- * @return int
- */
- 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);
- /**
- * @brief spi设备接收数据,返回接收字节数
- *
- * @param spi_dev luat_spi_device_t 结构体
- * @param recv_buf 接收数据
- * @param length 数据长度
- * @return int 返回接收字节数
- */
- int luat_spi_device_recv(luat_spi_device_t* spi_dev, char* recv_buf, size_t length);
- /**
- * @brief spi设备发送数据,返回接收字节数
- *
- * @param spi_dev luat_spi_device_t 结构体
- * @param send_buf 发送数据
- * @param length 数据长度
- * @return int 返回发送字节数
- */
- int luat_spi_device_send(luat_spi_device_t* spi_dev, const char* send_buf, size_t length);
- /**
- * @brief 锁定SPI,只有主模式下才能使用,多个设备挂载在同一条总线上需要使用
- *
- * @param spi_id spi id
- * @return int 成功返回0,其他-1
- */
- int luat_spi_lock(int spi_id);
- /**
- * @brief 释放SPI,只有主模式下才能使用,多个设备挂载在同一条总线上需要使用
- *
- * @param spi_id spi id
- * @return int 成功返回0,其他-1
- */
- int luat_spi_unlock(int spi_id);
- /**@}*/
- #endif
|