RT-Thread API参考手册
3.1.1
嵌入式实时操作系统
|
SPI设备接口 更多...
结构体 | |
struct | rt_spi_message |
SPI消息 更多... | |
struct | rt_spi_configuration |
SPI从设备的配置参数 更多... | |
struct | rt_spi_bus |
SPI总线控制块 更多... | |
struct | rt_spi_ops |
SPI总线的操作方法 更多... | |
struct | rt_spi_device |
SPI从设备 更多... | |
宏定义 | |
#define | RT_SPI_CPHA (1<<0) |
bit[0]:CPHA, 时钟极性 | |
#define | RT_SPI_CPOL (1<<1) |
bit[1]:CPOL, 时钟相位 | |
#define | RT_SPI_LSB (0<<2) |
bit[2]: LSB位在前 | |
#define | RT_SPI_MSB (1<<2) |
bit[2]: MSB位在前 | |
#define | RT_SPI_MASTER (0<<3) |
SPI 做主设备 | |
#define | RT_SPI_SLAVE (1<<3) |
SPI 做从设备 | |
#define | RT_SPI_MODE_0 (0 | 0) |
CPOL = 0, CPHA = 0. | |
#define | RT_SPI_MODE_1 (0 | RT_SPI_CPHA) |
CPOL = 0, CPHA = 1. | |
#define | RT_SPI_MODE_2 (RT_SPI_CPOL | 0) |
CPOL = 1, CPHA = 0. | |
#define | RT_SPI_MODE_3 (RT_SPI_CPOL | RT_SPI_CPHA) |
CPOL = 1, CPHA = 1. | |
#define | RT_SPI_CS_HIGH (1<<4) |
片选高电平有效 | |
#define | RT_SPI_NO_CS (1<<5) |
不使用片选 | |
#define | RT_SPI_3WIRE (1<<6) |
MOSI和MISO共用一根数据线 | |
#define | RT_SPI_READY (1<<7) |
从设备拉低暂停 | |
函数 | |
rt_err_t | rt_spi_bus_register (struct rt_spi_bus *bus, const char *name, const struct rt_spi_ops *ops) |
注册SPI 总线设备 更多... | |
rt_err_t | rt_spi_bus_attach_device (struct rt_spi_device *device, const char *name, const char *bus_name, void *user_data) |
挂载 SPI 从设备到SPI总线设备上 更多... | |
rt_err_t | rt_spi_take_bus (struct rt_spi_device *device) |
获取 SPI 总线设备 更多... | |
rt_err_t | rt_spi_release_bus (struct rt_spi_device *device) |
释放 SPI 总线设备 更多... | |
rt_err_t | rt_spi_take (struct rt_spi_device *device) |
获取片选 更多... | |
rt_err_t | rt_spi_release (struct rt_spi_device *device) |
释放片选 更多... | |
rt_err_t | rt_spi_configure (struct rt_spi_device *device, struct rt_spi_configuration *cfg) |
SPI 从设备配置 更多... | |
rt_err_t | rt_spi_send_then_recv (struct rt_spi_device *device, const void *send_buf, rt_size_t send_length, void *recv_buf, rt_size_t recv_length) |
先发送后接收数据 更多... | |
rt_err_t | rt_spi_send_then_send (struct rt_spi_device *device, const void *send_buf1, rt_size_t send_length1, const void *send_buf2, rt_size_t send_length2) |
连续发送两次数据 更多... | |
rt_size_t | rt_spi_transfer (struct rt_spi_device *device, const void *send_buf, void *recv_buf, rt_size_t length) |
传输一次数据 更多... | |
struct rt_spi_message * | rt_spi_transfer_message (struct rt_spi_device *device, struct rt_spi_message *message) |
多个消息连续传输 更多... | |
rt_inline rt_size_t | rt_spi_recv (struct rt_spi_device *device, void *recv_buf, rt_size_t length) |
接收数据 更多... | |
rt_inline rt_size_t | rt_spi_send (struct rt_spi_device *device, const void *send_buf, rt_size_t length) |
发送数据 更多... | |
rt_inline void | rt_spi_message_append (struct rt_spi_message *list, struct rt_spi_message *message) |
增加一条消息 更多... | |
SPI设备接口
rt_err_t rt_spi_bus_register | ( | struct rt_spi_bus * | bus, |
const char * | name, | ||
const struct rt_spi_ops * | ops | ||
) |
注册SPI 总线设备
调用此函数可以向系统中注册 SPI 总线设备。
bus | SPI 总线设备句柄 |
name | SPI 总线设备名称,一般与硬件控制器名称一致,如:“spi0” |
ops | SPI 总线设备的操作方法,即 SPI 驱动的实现 |
rt_err_t rt_spi_bus_attach_device | ( | struct rt_spi_device * | device, |
const char * | name, | ||
const char * | bus_name, | ||
void * | user_data | ||
) |
挂载 SPI 从设备到SPI总线设备上
此函数用于挂载一个SPI设备节点到指定的SPI总线,并内核注册SPI设备节点,并将user_data保存到SPI设备节点的user_data指针里。
device | SPI 从设备句柄 |
name | SPI 从设备名称,SPI从设备命名原则为spixy,如spi10表示挂载在总线spi1上的0号设备 |
bus_name | SPI 总线设备名称 |
user_data | 用户数据指针,一般为SPI从设备对应的CS引脚信息,进行数据传输时SPI控制器会操作此引脚进行片选 |
rt_err_t rt_spi_take_bus | ( | struct rt_spi_device * | device | ) |
获取 SPI 总线设备
用户调用此函数来获取SPI总线设备,并设置SPI总线设备的工作模式和参数。
device | SPI 从设备句柄 |
rt_err_t rt_spi_release_bus | ( | struct rt_spi_device * | device | ) |
释放 SPI 总线设备
用户可以调用此函数来释放SPI总线设备。
device | SPI 从设备句柄 |
rt_err_t rt_spi_take | ( | struct rt_spi_device * | device | ) |
获取片选
调用此函数可以片选SPI设备。
device | SPI 从设备句柄 |
rt_err_t rt_spi_release | ( | struct rt_spi_device * | device | ) |
释放片选
调用此函数可以释放被片选SPI设备。
device | SPI 从设备句柄 |
rt_err_t rt_spi_configure | ( | struct rt_spi_device * | device, |
struct rt_spi_configuration * | cfg | ||
) |
SPI 从设备配置
本函数用于配置SPI 从设备的时钟、数据宽度等要求,通常需要配置SPI模式、频率参数。
device | SPI 从设备句柄 |
cfg | SPI 配置参数指针 |
rt_err_t rt_spi_send_then_recv | ( | struct rt_spi_device * | device, |
const void * | send_buf, | ||
rt_size_t | send_length, | ||
void * | recv_buf, | ||
rt_size_t | recv_length | ||
) |
先发送后接收数据
本函数适合从SPI外设中读取一块数据,本函数中会先发送一些数据(如命令和地址),然后再接收指定长度的数据。此函数等同于调用rt_spi_transfer_message()传输2条消息。
device | SPI 从设备句柄 |
send_buf | 发送缓冲区数据指针 |
send_length | 发送缓冲区数据字节数 |
recv_buf | 接收缓冲区数据指针,spi 是全双工的,支持同时收发 |
recv_length | 接收缓冲区数据字节数 |
rt_err_t rt_spi_send_then_send | ( | struct rt_spi_device * | device, |
const void * | send_buf1, | ||
rt_size_t | send_length1, | ||
const void * | send_buf2, | ||
rt_size_t | send_length2 | ||
) |
连续发送两次数据
如果需要先后连续发送2个缓冲区的数据,并且中间片选不释放,可以调用此函数。 本函数适合向SPI从设备中写入一块数据,第一次先发送命令和地址等数据,第二次再发送指定长度的数据。
device | SPI 从设备句柄 |
send_buf1 | 发送缓冲区1数据指针 |
send_length1 | 发送缓冲区1数据字节数 |
send_buf2 | 发送缓冲区2数据指针 |
send_length2 | 发送缓冲区2数据字节数 |
rt_size_t rt_spi_transfer | ( | struct rt_spi_device * | device, |
const void * | send_buf, | ||
void * | recv_buf, | ||
rt_size_t | length | ||
) |
传输一次数据
此函数可以传输传输一次数据。此函数等同于调用rt_spi_transfer_message()传输一条消息,开始发送数据时片选选中,函数返回时释放片选。
device | SPI 从设备句柄 |
send_buf | 发送缓冲区指针 |
recv_buf | 接收缓冲区指针 |
length | 发送 / 接收 数据字节数 |
struct rt_spi_message* rt_spi_transfer_message | ( | struct rt_spi_device * | device, |
struct rt_spi_message * | message | ||
) |
多个消息连续传输
此函数可以传输一连串消息,用户可以很灵活的设置message结构体各参数的数值,从而可以很方便的控制数据传输方式。
device | SPI 从设备句柄 |
message | 消息指针 |
rt_inline rt_size_t rt_spi_recv | ( | struct rt_spi_device * | device, |
void * | recv_buf, | ||
rt_size_t | length | ||
) |
接收数据
调用此函数接受数据并保存到recv_buf指向的缓冲区。此函数是对rt_spi_transfer()函数的封装。 SPI协议里面只能由MASTER主动产生时钟,因此,在接收数据时,会发送dummy。
device | SPI 从设备句柄 |
recv_buf | 接收缓冲区指针 |
length | 接受数据的字节数 |
rt_inline rt_size_t rt_spi_send | ( | struct rt_spi_device * | device, |
const void * | send_buf, | ||
rt_size_t | length | ||
) |
发送数据
调用此函数发送send_buf指向的缓冲区的数据,忽略接收到的数据。 此函数是对rt_spi_transfer()函数的封装,开始发送数据时片选选中,函数返回时释放片选。
device | SPI 从设备句柄 |
send_buf | 发送缓冲区指针 |
length | 发送数据的字节数 |
rt_inline void rt_spi_message_append | ( | struct rt_spi_message * | list, |
struct rt_spi_message * | message | ||
) |
增加一条消息
使用rt_spi_transfer_message()传输消息时, 所有待传输的消息都是以单向链表的形式连接起来的,可使用如下函数往消息链表里增加一条新的待传输消息。
list | 消息链表指针 |
message | 消息指针 |