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文件末尾