1.10. SPI
硬件SPI接口,spi0被系统占用,spi1/spi2可以选择任意io,硬件spi时钟源是lsb,分频:1~256。每个spi配一个dma,不能同时双向dma。
spi功能简介 |
||
---|---|---|
spi1 |
spi2 |
|
主从 |
🆗 |
🆗 |
收发 |
🆗 |
🆗 |
dma |
🆗 |
🆗 |
位宽1,2,4 |
1,2,4 |
1,2 |
四种位流 |
🆗 |
🆗 |
四种时序 |
🆗 |
🆗 |
1.10.1. 示例
详见文件 spi_demo.c文件末尾
1.10.2. 硬件spi基本接口
1.10.2.1. get_hw_spi_config
为兼容旧接口新增,功能:获取硬件spi配置结构体。
原型:
struct spi_platform_data *get_hw_spi_config(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
硬件spi配置信息
1.10.2.2. spi_open
初始化硬件spi。
原型:
int spi_open(hw_spi_dev spi, spi_hardware_info *spi_info);
- 参数:
spi
硬件spi索引号0~n
spi_info
硬件spi配置信息
返回值
返回执行状态:0:ok;<0:error
示例:
struct spi_platform_data spix_p_data_test = {
.port = {
IO_PORTC_00, //clk any io
IO_PORTC_01, //do any io
IO_PORTC_02, //di any io
IO_PORTC_03, //d2 any io
IO_PORTC_04, //d3 any io
0xff, //cs (主机不操作cs)
},
.role = SPI_ROLE_MASTER,
.mode = SPI_MODE_UNIDIR_2BIT,//SPI_MODE_BIDIR_1BIT,
.bit_mode = SPI_FIRST_BIT_MSB,
.cpol = 0,//clk level in idle state:0:low, 1:high
.cpha = 0,//sampling edge:0:first, 1:second
.ie_en = 0, //ie enbale:0:disable, 1:enable
.spi_isr_callback = NULL, //spi isr callback
.clk = 1000000L,
};
//init
int ret = spi_open(spi, &spix_p_data_test);
if (ret < 0) {
log_error("spi init error(%d)!", ret);
}
1.10.2.3. spi_close
关闭硬件spi,释放io为高阻状态,关闭crossbar映射。
原型:
void spi_close(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
无
1.10.2.4. spi_suspend
挂起硬件spi,关闭io及spi。
原型:
void spi_suspend(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
无
1.10.2.5. spi_resume
恢复硬件spi,还原io状态到初始化状态。
原型:
void spi_resume(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
无
1.10.2.6. spi_set_bit_mode
设置或改变spi位宽工作模式,初始化对应的io,不会注销已经初始化的io。
原型:
void spi_set_bit_mode(hw_spi_dev spi, enum spi_mode mode);
- 参数:
spi
硬件spi索引号0~n
mode
位宽模式,详见枚举enum spi_mode
返回值
无
1.10.2.7. spi_set_baud
设置或改变硬件spi通信频率。
原型:
int spi_set_baud(hw_spi_dev spi, u32 baud);
- 参数:
spi
硬件spi索引号0~n
baud
频率,单位hz
返回值
执行状态:<0:error;0:ok
1.10.2.8. spi_get_baud
获取硬件spi当前频率。
原型:
u32 spi_get_baud(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
频率,单位hz
1.10.2.9. spi_set_ie
设置硬件spi中断使能位,不注册中断回调函数。
原型:
void spi_set_ie(hw_spi_dev spi, u8 en);
- 参数:
spi
硬件spi索引号0~n
en
中断状态:1:使能;0:关闭
返回值
无
1.10.2.10. spi_get_pending
获取硬件spi中断标志。
原型:
u8 spi_get_pending(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
中断标志:1:被置位;0:无
1.10.2.11. spi_clear_pending
清除硬件spi中断标志。
原型:
void spi_clear_pending(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
无
1.10.2.12. spi_send_byte
硬件spi发送一个byte数据,返回发送状态,阻塞发送,会一直等spi发送完成。
原型:
int spi_send_byte(hw_spi_dev spi, u8 byte);
- 参数:
spi
硬件spi索引号0~n
byte
待发送的数据
返回值
执行状态:<0:error;0:ok
1.10.2.13. spi_recv_byte
硬件spi接收一个byte数据,返回接收的数据,阻塞接收,会一直等spi接收完成。
原型:
u8 spi_recv_byte(hw_spi_dev spi, int *err);
- 参数:
spi
硬件spi索引号0~n
err
返回错误信息,若err为非空指针,0 成功,< 0 失败,若为空指针,忽略
返回值
接收的数据
1.10.2.14. spi_send_recv_byte
硬件spi双向通信,同时发送并接收一个byte数据,返回接收的数据,阻塞接收,会一直等spi完成。
原型:
u8 spi_send_recv_byte(hw_spi_dev spi, u8 byte, int *err);
- 参数:
spi
硬件spi索引号0~n
byte
待发送的数据
err
返回错误信息,若err为非空指针,0 成功,< 0 失败,若为空指针,忽略
返回值
接收的数据
1.10.2.15. spi_dma_recv
硬件spi使用dma接收指定长度的数据,阻塞模式,一直等待spi接收完成。
原型:
int spi_dma_recv(hw_spi_dev spi, void *buf, u32 len);
- 参数:
spi
硬件spi索引号0~n
buf
接收缓存buf
len
接收长度
返回值
接收的数据长度:=len:成功;其他值:失败
1.10.2.16. spi_dma_send
硬件spi发送指定长度的数据,阻塞模式,一直等待spi发送完成。
原型:
int spi_dma_send(hw_spi_dev spi, const void *buf, u32 len);
- 参数:
spi
硬件spi索引号0~n
buf
发送缓存buf
len
发送长度
返回值
发送的数据长度:=len:成功;其他值:失败
1.10.3. 硬件spi主从机中断接口
1.10.3.1. spi_byte_transmit_for_isr
硬件spi收发一个byte数据,单向或全双工模式,无返回值,不会等spi发送完成,可用于中断, 适用主从。
原型:
void spi_byte_transmit_for_isr(hw_spi_dev spi, u8 tx_byte, u8 *rx_byte, u8 rw);//rw:1-rx; 0-tx
- 参数:
spi
硬件spi索引号0~n
tx_byte
待发送的数据
rx_byte
待发接收的数据的地址
rw
收发控制。0:发送或全双工;1:接收
返回值
无
1.10.3.2. spi_buf_transmit_for_isr
硬件spi收发len个byte数据,单向或全双工模式,无返回值,不会等spi发送完成,可用于中断, 适用主从。
原型:
void spi_buf_transmit_for_isr(hw_spi_dev spi, u8 *tx_buf, u8 *rx_buf, int len, u8 rw);//rw:1-rx; 0-tx
- 参数:
spi
硬件spi索引号0~n
tx_buf
待发送的数据的地址
rx_buf
待发接收的数据的地址
len
收发长度
rw
收发控制。0:发送或全双工;1:接收
返回值
无
1.10.3.3. spi_dma_transmit_for_isr
硬件spi dma发送或接收指定长度的数据,不会等待spi操作完成,半双工,可用于中断, 适用主从。
原型:
void spi_dma_transmit_for_isr(hw_spi_dev spi, void *buf, int len, u8 rw);//rw:1-rx; 0-tx
- 参数:
spi
硬件spi索引号0~n
buf
发送或接收缓存buf地址
len
发送或接收长度
rw
收发控制。0:发送;1:接收
返回值
无
1.10.3.4. hw_spix_irq_change_callback
切换中断回调函数。
原型:
void hw_spix_irq_change_callback(hw_spi_dev spi, void (*spi_isr_callback_f)(hw_spi_dev spi, enum hw_spi_isr_status sta));
- 参数:
spi
硬件spi索引号0~n
spi_isr_callback_f
中断回调函数或NULL
返回值
无
1.10.3.5. hw_spix_get_isr_status
获取硬件spi主机或从机byte或dma收发状态,并清除收发状态(只用于中断模式)。
原型:
enum hw_spi_isr_status hw_spix_get_isr_status(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
收发状态:详见枚举
1.10.3.6. hw_spix_clear_isr_len
每包数据前清空收发长,在通信中间调用,会导致数据长不准(只用于中断模式)。
原型:
void hw_spix_clear_isr_len(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
无
1.10.3.7. hw_spix_get_isr_len
获取硬件spi主机或从机byte或dma收发长度(只用于中断模式)。返回带符号数据,符号表示dma(-)还是byte(+),数据表示长度,结合hw_spix_get_isr_status可知是接收还是发送
原型:
int hw_spix_get_isr_len(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
收发长度(符号表示dma(-)还是byte(+),数据表示长度)
1.10.4. 硬件spi从机接口
1.10.4.1. hw_spix_slave_get_dma_len
获取硬件spi从机不开中断dma收发长度(dma未完成获取当前已传输个数)。返回带符号数据,符号表示dma(-),数据表示长度,不能区分收发。
原型:
int hw_spix_slave_get_dma_len(hw_spi_dev spi);
- 参数:
spi
硬件spi索引号0~n
返回值
收发长度(符号表示dma(-),数据表示长度)
1.10.5. 示例
详见文件 spi_demo.c文件末尾