Part5
传输初始化 在 AMetal 中,将收发一次数据的过程抽象为一个“传输” 的概念,要完成一次数据传输,首先就需要初始化一个传输结构体,指定该次数据传输的相关信息。其函数原型为:
void am_spi_mktrans(
am_spi_transfer_t *p_trans, //待初始化的 SPI 传输
const void *p_txbuf, // 发送数据缓冲区,NULL无数据
void *p_rxbuf, //接收数据缓冲区,NULL无数据
uint32_t nbytes, //传输的字节数
uint8_t cs_change, //传输是否影响片选, 0-不影响,1-影响
uint8_t bits_per_word, //为 0 默认使用设备的字大小
uint16_t delay_usecs, //传输结束后的延时(us)
uint32_t speed_hz, //为0默认使用设备中的max_speed_hz
uint32_t f lags); // 本次传输的特殊标志 其中,p_trans 为指向SPI传输结构体的指针,am_spi_transfer_t类型是在 am_spi.h 中定义的。即:
typedef struct am_spi_transfer am_spi_transfer_t 在实际使用时,只需要定义一个该类型的传输结构体即可。比如:
am_spi_transfer_t spi_trans; //定义一个 SPI 传输结构体
因为 SPI 是全双工通信协议,所以单次传输过程中同时包含了数据的发送和接收。函数的参数中,p_txbuf 指定了发送数据的缓冲区,p_rxbuf 指定了接收数据的缓冲区,nbytes 指定了传输的字节数。特别地,有时候可能只希望单向传输数据,若只发送数据,则可以设置p_rxbuf 为 NULL;若只接收数据,则可以设置 p_txbuf 为 NULL。 当传输正常进行时,片选会置为有效状态, cs_change 的值将影响片选何时被置为无效状态。若 cs_change 的值为 0,表明不影响片选,此时,仅当该次传输是消息(多次传输组成一个消息,消息的概念后文会介绍)的最后一次传输时,片选才会被置为无效状态。若cs_change 的值为 1,表明影响片选,此时,若该次传输不是消息的最后一次传输,则在本次传输结束后会立即将片选设置为无效状态,若该次传输是消息的最后一次传输,则不会立即设置片选无效,而是保持有效直到下一个消息的第一次传输开始。
uint8_t tx_buf[8];
uint8_t rx_buf[8];
am_spi_transfer_t spi_trans;
am_spi_mktrans(
&spi_trans,
tx_buf, // 发送数据缓冲区
rx_buf, // 接收数据缓冲区
8, // 传输数据个数为 8
0, // 本次传输不影响片选
0, // 位宽为 0,使用默认位宽(设备中的位宽)
0, // 传输后无需延时
0, // 时钟频率,使用默认速率
0); // 无特殊标志
|