RT-Thread设备驱动框架之spi设备驱动框架

1.构造数据类型
1.1.SPI消息结构体
RT-Thread设备驱动框架之spi设备驱动框架_第1张图片
1.2.SPI配置结构体
RT-Thread设备驱动框架之spi设备驱动框架_第2张图片
1.3.SPI总线结构体
RT-Thread设备驱动框架之spi设备驱动框架_第3张图片
1.4.SPI操作结构体(配置函数和传输函数指针)
在这里插入图片描述
1.5.SPI设备结构体
RT-Thread设备驱动框架之spi设备驱动框架_第4张图片
1.6.QSPI消息结构体
RT-Thread设备驱动框架之spi设备驱动框架_第5张图片
1.7.QSPI配置结构体
RT-Thread设备驱动框架之spi设备驱动框架_第6张图片
1.8.QSPI设备结构体
RT-Thread设备驱动框架之spi设备驱动框架_第7张图片
2.SPI总线
2.1.SPI总线注册
SPI总线设备初始化(传递总线对象和名称)
若SPI总线设备初始化失败则返回
以先进先出方式初始化SPI总线互斥锁(SPI总线同时只能被一个spi设备持有)
把SPI总线设备操作实例赋值给SPI总线操作结构体指针
SPI总线持有指针赋为空地址
总线模式设置为SPI总线
2.2.SPI总线连接设备
根据SPI设备总线名称查找SPI设备总线对象是否存在于设备对象容器中
若SPI总线对象存在且总线类型为SPI总线设备类型
则将SPI总线对象赋给SPI设备对象的总线指针
SPI设备对象初始化(传递SPI设备对象指针和设备名称)
SPI设备配置信息初始化为零
SPI设备用户数据指针赋值
2.3.SPI总线配置
若SPI设备对象指针不为空,则配置SPI的数据宽度、模式和波特率
若SPI设备对象的总线指针不为空,则以一直等待的方式试图独占SPI总线
已独占SPI总线,且总线的持有者是此SPI设备,则通过SPI总线操作的配置函数指针调用SPI总线配置函数
释放SPI设备总线
2.4.SPI发送后发送
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空
以一直等待的方式试图独占SPI设备对象的总线(成员)
独占SPI总线成功,若Spi设备对象的总线拥有者不是本设备,则根据SPI设备对象配置信息重新配置SPI总线,并将Spi设备对象的总线拥有者设置为本设备。
调用注册到SPI设备总线(操作)传输函数指针的传输函数,分别发送两条消息。
释放SPI设备总线
2.5.SPI发送后接收
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空
以一直等待的方式试图独占SPI设备对象的总线(成员)
独占SPI总线成功,若Spi设备对象的总线拥有者不是本设备,则根据SPI设备对象配置信息重新配置SPI总线,并将Spi设备对象的总线拥有者设置为本设备。
调用注册到SPI设备总线(操作)传输函数指针的传输函数,发送一条消息,然后接收一条消息。
释放spi设备总线
2.6.SPI传输
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空
以一直等待的方式试图独占SPI设备对象的总线(成员)
独占SPI总线成功,若Spi设备对象的总线拥有者不是本设备,则根据SPI设备对象配置信息重新配置SPI总线,并将Spi设备对象的总线拥有者设置为本设备。
调用注册到SPI设备总线(操作)传输函数指针的传输函数,发送一条消息同时接收一条消息
释放spi设备总线
2.7.SPI传输消息
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空
以一直等待的方式试图独占SPI设备对象的总线(成员)
独占SPI总线成功,若Spi设备对象的总线拥有者不是本设备,则根据SPI设备对象配置信息重新配置SPI总线,并将Spi设备对象的总线拥有者设置为本设备。
调用注册到SPI设备总线(操作)传输函数指针的传输函数,依次传输消息
释放spi设备总线
2.8.获取SPI总线使用权
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空
以一直等待的方式试图独占SPI设备对象的总线(成员)
独占SPI总线成功,若Spi设备对象的总线拥有者不是本设备,则根据SPI设备对象配置信息重新配置SPI总线,并将Spi设备对象的总线拥有者设置为本设备。
2.9.SPI释放总线
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空,判断Spi设备对象的总线拥有者是不是本设备
释放SPI设备总线互斥信号量,并取出等待SPI总线链表的下一个节点持有SPI总线。
2.10.SPI持有
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空
清空SPI消息对象,设置片选信号为持有
调用注册到SPI设备总线(操作)传输函数指针的传输函数
2.11.SPI释放
判断SPI设备指针是否为空,判断SPI设备对象的总线指针是否为空
清空SPI消息对象,设置片选信号为释放
调用注册到SPI设备总线(操作)传输函数指针的传输函数
3.SPI设备
3.1.SPI总线设备读
强制转换设备对象为SPI总线设备对象。
判断spi总线对象(指针)是否为空,判断SPI总线持有者(指针)是否为空。
调用SPI传输函数(传递spi总线持有设备指针、接收缓冲区、接收尺寸)。
3.2.SPI总线设备写
强制转换设备对象为SPI总线设备对象。
判断spi总线对象(指针)是否为空,判断SPI总线持有者(指针)是否为空。
调用SPI传输函数(传递spi总线持有设备指针、发送缓冲区、发送尺寸)。
3.3.SPI总线设备控制
此函数不执行任何操作。
3.4.SPI总线设备操作实例初始化(函数指针成员赋值)

const static struct rt_device_ops spi_bus_ops = 
{
    RT_NULL,
    RT_NULL,
    RT_NULL,
    _spi_bus_device_read,
    _spi_bus_device_write,
    _spi_bus_device_control
};

3.5.SPI总线设备初始化
判断spi总线对象(指针)是否为空
设置SPI总线设备对象spi总线设备。
初始化各设备操作函数。
注册SPI总线设备对象(标志为读写)–将SPI总线设备挂接到设备对象容器链表当中。
3.6.SPI设备读
强制转换设备对象为SPI设备对象。
判断spi设备对象(指针)是否为空,判断SPI设备总线(指针)是否为空。
调用SPI传输函数(传递spi设备指针、接收缓冲区、接收尺寸)。
3.7.SPI设备写
强制转换设备对象为SPI设备对象。
判断spi设备对象(指针)是否为空,判断SPI设备总线(指针)是否为空。
调用SPI传输函数(传递spi设备指针、发送缓冲区、发送尺寸)。
3.8.SPI设备控制
此函数不执行任何操作。
3.9.SPI设备操作实例初始化(函数指针成员赋值)

const static struct rt_device_ops spi_device_ops = 
{
    RT_NULL,
    RT_NULL,
    RT_NULL,
    _spidev_device_read,
    _spidev_device_write,
    _spidev_device_control
};

3.10.SPI设备初始化
判断spi设备对象(指针)是否为空
设置SPI设备对象类型为spi设备。
初始化各设备操作函数。
注册SPI设备对象(标志为读写)——将SPI设备挂接到设备对象容器链表当中。

你可能感兴趣的:(RT-Thread)