SPI ####################### 硬件SPI接口,spi0被系统占用,不可使用。硬件spi时钟源是lsb,分频:1~256。每个spi配一个dma,不能同时双向dma。 spi模式:主从;dma半双工;位宽1,2,4;四种位流;时钟极性,采样极性可配 ------------------------------------------------------- 硬件spi基本接口 ------------------------------------------------------- get_hw_spi_config ------------------------------------------------------- 为兼容旧接口新增,功能:获取硬件spi配置结构体。 原型: .. code-block:: c struct spi_platform_data *get_hw_spi_config(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 硬件spi配置信息 ============ ============================================= spi_open ------------------------------------------------------- 初始化硬件spi。 原型: .. code-block:: c int spi_open(hw_spi_dev spi, spi_hardware_info *spi_info); 参数: ============ ============================================= spi 硬件spi索引号0~n spi_info 硬件spi配置信息 返回值 返回执行状态:0:ok;<0:error ============ ============================================= 示例: .. code-block:: c struct spi_platform_data spix_p_data_test = { .port = { // 未用到的io配置为0xff 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 .irq_priority = 3,//中断优先级 .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); } spi_deinit ------------------------------------------------------- 关闭硬件spi,释放io为高阻状态,关闭crossbar映射。 原型: .. code-block:: c void spi_deinit(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 无 ============ ============================================= spi_suspend ------------------------------------------------------- 挂起硬件spi,关闭io及spi。 原型: .. code-block:: c void spi_suspend(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 无 ============ ============================================= spi_resume ------------------------------------------------------- 恢复硬件spi,还原io状态到初始化状态。 原型: .. code-block:: c void spi_resume(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 无 ============ ============================================= spi_set_bit_mode ------------------------------------------------------- 设置或改变spi位宽工作模式,初始化对应的io,不会注销已经初始化的io。 原型: .. code-block:: c void spi_set_bit_mode(hw_spi_dev spi, enum spi_mode mode); 参数: ============ ============================================= spi 硬件spi索引号0~n mode 位宽模式,详见枚举enum spi_mode 返回值 无 ============ ============================================= spi_set_baud ------------------------------------------------------- 设置或改变硬件spi通信频率。 原型: .. code-block:: c int spi_set_baud(hw_spi_dev spi, u32 baud); 参数: ============ ============================================= spi 硬件spi索引号0~n baud 频率,单位hz 返回值 执行状态:<0:error;0:ok ============ ============================================= spi_get_baud ------------------------------------------------------- 获取硬件spi当前频率。 原型: .. code-block:: c u32 spi_get_baud(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 频率,单位hz ============ ============================================= spi_set_ie ------------------------------------------------------- 仅配置硬件spi中断使能位,不注册中断回调函数。 原型: .. code-block:: c void spi_set_ie(hw_spi_dev spi, u8 en); 参数: ============ ============================================= spi 硬件spi索引号0~n en 中断状态:1:使能;0:关闭 返回值 无 ============ ============================================= spi_get_pending ------------------------------------------------------- 获取硬件spi中断标志。 原型: .. code-block:: c u8 spi_get_pending(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 中断标志:1:被置位;0:无 ============ ============================================= spi_clear_pending ------------------------------------------------------- 清除硬件spi中断标志。 原型: .. code-block:: c void spi_clear_pending(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 无 ============ ============================================= spi_send_byte ------------------------------------------------------- 硬件spi主机模式cpu发送一个byte数据,返回发送状态,阻塞发送,会一直等spi发送完成。 原型: .. code-block:: c int spi_send_byte(hw_spi_dev spi, u8 byte); 参数: ============ ============================================= spi 硬件spi索引号0~n byte 待发送的数据 返回值 执行状态:<0:error;0:ok ============ ============================================= spi_recv_byte ------------------------------------------------------- 硬件spi主机模式cpu接收一个byte数据,返回接收的数据,阻塞接收,会一直等spi接收完成。 原型: .. code-block:: c u8 spi_recv_byte(hw_spi_dev spi, int *err); 参数: ============ ============================================= spi 硬件spi索引号0~n err 返回错误信息,若err为非空指针,0 成功,< 0 失败,若为空指针,忽略 返回值 接收的数据 ============ ============================================= spi_send_recv_byte ------------------------------------------------------- 硬件spi主机模式cpu全双工通信,同时发送并接收一个byte数据,返回接收的数据,阻塞接收,会一直等spi完成。 原型: .. code-block:: c u8 spi_send_recv_byte(hw_spi_dev spi, u8 byte, int *err); 参数: ============ ============================================= spi 硬件spi索引号0~n byte 待发送的数据 err 返回错误信息,若err为非空指针,0 成功,< 0 失败,若为空指针,忽略 返回值 接收的数据 ============ ============================================= spi_dma_recv ------------------------------------------------------- 硬件spi主机模式使用dma接收指定长度的数据,阻塞模式,一直等待spi接收完成。 原型: .. code-block:: c int spi_dma_recv(hw_spi_dev spi, void *buf, u32 len); 参数: ============ ============================================= spi 硬件spi索引号0~n buf 接收缓存buf len 接收长度 返回值 接收的数据长度:=len:成功;其他值:失败 ============ ============================================= spi_dma_send ------------------------------------------------------- 硬件spi主机模式dma发送指定长度的数据,阻塞模式,一直等待spi发送完成。 原型: .. code-block:: c int spi_dma_send(hw_spi_dev spi, const void *buf, u32 len); 参数: ============ ============================================= spi 硬件spi索引号0~n buf 发送缓存buf len 发送长度 返回值 发送的数据长度:=len:成功;其他值:失败 ============ ============================================= ------------------------------------------------------- 硬件spi主从机中断接口 ------------------------------------------------------- spi_byte_transmit_for_isr ------------------------------------------------------- 硬件spi收发一个byte数据,单向或全双工模式,无返回值,不会等spi发送完成,可用于中断, 适用主从。 原型: .. code-block:: c 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 待发送的数据,rw=1时无效 rx_byte 待发接收的数据的地址 rw 收发控制。0:发送或全双工;1:接收 返回值 无 ============ ============================================= spi_buf_transmit_for_isr ------------------------------------------------------- 硬件spi收发len个byte数据,单向或全双工模式,无返回值,不会等spi发送完成,可用于中断, 适用主从。 原型: .. code-block:: c 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:接收 返回值 无 ============ ============================================= spi_dma_transmit_for_isr ------------------------------------------------------- 硬件spi dma发送或接收指定长度的数据,不会等待spi操作完成,半双工,可用于中断, 适用主从。 原型: .. code-block:: c 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:接收 返回值 无 ============ ============================================= hw_spix_irq_change_callback ------------------------------------------------------- 切换中断回调函数。 原型: .. code-block:: c 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 返回值 无 =================== ============================================= hw_spix_get_isr_status ------------------------------------------------------- 获取硬件spi主机或从机byte或dma收发状态,并清除收发状态(只用于中断模式)。 原型: .. code-block:: c enum hw_spi_isr_status hw_spix_get_isr_status(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 收发状态:详见枚举 ============ ============================================= hw_spix_clear_isr_len ------------------------------------------------------- 每包数据前清空收发长,在通信中间调用,会导致数据长不准(只用于中断模式)。 原型: .. code-block:: c void hw_spix_clear_isr_len(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 无 ============ ============================================= hw_spix_get_isr_len ------------------------------------------------------- 主机或从机且开中断模式下:获取硬件spibyte或dma收发长度(只用于中断模式)。返回带符号数据,符号表示dma(-)还是byte(+),数据表示长度,结合hw_spix_get_isr_status可知是接收还是发送 原型: .. code-block:: c int hw_spix_get_isr_len(hw_spi_dev spi); 参数: ============ ================================================== spi 硬件spi索引号0~n 返回值 收发长度(符号表示dma(-)还是byte(+),数据表示长度) ============ ================================================== hw_spix_slave_get_dma_len ------------------------------------------------------- 从机且不开中断dma模式下:获取硬件spi dma当前收发长度(dma未完成获取当前已传输个数)。返回带符号数据,符号表示dma(-),数据表示长度,不能区分收发。 原型: .. code-block:: c int hw_spix_slave_get_dma_len(hw_spi_dev spi); 参数: ============ ============================================= spi 硬件spi索引号0~n 返回值 收发长度(符号表示dma(-),数据表示长度) ============ ============================================= ------------------------------------------------------- 示例 ------------------------------------------------------- :: 详见文件 spi_demo.c或spi_test.c文件