Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
内核学习营
SPI设备函数整理
发布于 2020-03-19 10:14:05 浏览:2776
订阅该版
[tocm] * 本帖最后由 水蜜桃菌 于 2020-3-19 10:20 编辑 * #### SPI设备 SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。SPI 一般使用 4 根线通信; MOSI –主机输出 / 从机输入数据线(SPI Bus Master Output/Slave Input)。 MISO –主机输入 / 从机输出数据线(SPI Bus Master Input/Slave Output)。 SCLK –串行时钟线(Serial Clock),主设备输出时钟信号至从设备。 CS –从设备选择线 (Chip select)。也叫 SS、CSB、CSN、EN 等,主设备输出片选信号至从设备。 |函数| 描述|定义|返回值| |:-----|:-------|:-------|:-------| |rt_spi_bus_attach_device()|挂载 SPI 设备|若使用 rt-thread/bsp/stm32 目录下的 BSP 则可以使用下面的函数挂载 SPI 设备到总线:rt_err_t rt_hw_spi_device_attach(const char * bus_name, const char * device_name, GPIO_TypeDef* cs_gpiox, uint16_t cs_gpio_pin);|RT_EOK 成功/其他错误码 失败| |rt_spi_configure()|配置 SPI 设备|rt_err_t rt_spi_configure(struct rt_spi_device * device, struct rt_spi_configuration * cfg)|RT_EOK 成功| |rt_qspi_configure()|配置 QSPI 设备|rt_err_t rt_qspi_configure(struct rt_qspi_device * device, struct rt_qspi_configuration * cfg);|RT_EOK 成功| |rt_device_find()| 根据 SPI 设备名称查找设备获取设备句柄|rt_device_t rt_device_find(const char* name);|设备句柄(查找到对应设备将返回相应的设备句柄)/RT_NULL (没有找到相应的设备对象)| |rt_spi_transfer_message()| 自定义传输数据|struct rt_spi_message * rt_spi_transfer_message(struct rt_spi_device * device,struct rt_spi_message * message);|RT_NULL(成功发送)/非空指针(发送失败,返回指向剩余未发送的 message 的指针)| |rt_spi_transfer() |传输一次数据|rt_size_t rt_spi_transfer(struct rt_spi_device * device, const void * send_buf,void * recv_buf,rt_size_t length);|0 传输失败/非 0 值 成功传输的字节数 |rt_spi_send() |发送一次数据|rt_size_t rt_spi_send(struct rt_spi_device * device,const void * send_buf,rt_size_t length)|0 传输失败/非 0 值 成功传输的字节数 |rt_spi_recv() |接受一次数据|rt_size_t rt_spi_recv(struct rt_spi_device * device,void * recv_buf,rt_size_t length);| |rt_spi_send_then_send() |连续两次发送|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_EOK 发送成功/-RT_EIO 发送失败 |rt_spi_send_then_recv() |先发送后接收|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_EOK 发送成功/-RT_EIO 发送失败 |rt_qspi_transfer_message()| 传输数据|rt_size_t rt_qspi_transfer_message(struct rt_qspi_device * device, struct rt_qspi_message * message); |rt_qspi_send_then_recv()|先发送后接收|rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device * device, const void * send_buf,rt_size_t send_length,void * recv_buf, rt_size_t recv_length);|RT_EOK 成功/其他错误码 失败| |rt_qspi_send() |发送一次数据|rt_err_t rt_qspi_send(struct rt_qspi_device * device, const void * send_buf, rt_size_t length)|RT_EOK 成功/其他错误码 失败| |rt_spi_take_bus()|获取总线|rt_err_t rt_spi_take_bus(struct rt_spi_device * device);|RT_EOK 成功/错误码 失败| |rt_spi_take()|选中片选|rt_err_t rt_spi_take(struct rt_spi_device * device);|0 成功/错误码 失败| |rt_spi_message_append()|增加一条消息|void rt_spi_message_append(struct rt_spi_message * list, struct rt_spi_message * message);|| |rt_spi_release() |释放片选|rt_err_t rt_spi_release(struct rt_spi_device * device);|0 成功/错误码 失败| |rt_spi_release_bus();|释放总线|rt_err_t rt_spi_release_bus(struct rt_spi_device * device);|RT_EOK 成功| **SPI 数据传输相关接口会调用 rt_mutex_take(), 此函数不能在中断服务程序里面调用,会导致 assertion 报错。** ``` //struct rt_spi_configuration 原型如下: struct rt_spi_configuration { rt_uint8_t mode; /* 模式 */ rt_uint8_t data_width; /* 数据宽度,可取8位、16位、32位 */ rt_uint16_t reserved; /* 保留 */ rt_uint32_t max_hz; /* 最大频率 */ }; //-------------------------------------------------------------------- //struct rt_qspi_configuration 原型如下: struct rt_qspi_configuration { struct rt_spi_configuration parent; /* 继承自 SPI 设备配置参数 */ rt_uint32_t medium_size; /* 介质大小 */ rt_uint8_t ddr_mode; /* 双倍速率模式 */ rt_uint8_t qspi_dl_width ; /* QSPI 总线位宽,单线模式 1 位、双线模式 2 位,4 线模式 4 位 */ }; //------------------------------------------------------------------- struct rt_spi_message { const void *send_buf; /* 发送缓冲区指针 */ void *recv_buf; /* 接收缓冲区指针 */ rt_size_t length; /* 发送 / 接收 数据字节数 */ struct rt_spi_message *next; /* 指向继续发送的下一条消息的指针 */ unsigned cs_take : 1; /* 片选选中 */ unsigned cs_release : 1; /* 释放片选 */ }; //*------------------------------------------------------------------- //使用实例 /* * 程序清单:这是一个 SPI 设备使用例程 * 例程导出了 spi_w25q_sample 命令到控制终端 * 命令调用格式:spi_w25q_sample spi10 * 命令解释:命令第二个参数是要使用的SPI设备名称,为空则使用默认的SPI设备 * 程序功能:通过SPI设备读取 w25q 的 ID 数据 */ #include
#include
#define W25Q_SPI_DEVICE_NAME "qspi10" static void spi_w25q_sample(int argc, char *argv[]) { struct rt_spi_device *spi_dev_w25q; char name[RT_NAME_MAX]; rt_uint8_t w25x_read_id = 0x90; rt_uint8_t id[5] = {0}; if (argc == 2) { rt_strncpy(name, argv[1], RT_NAME_MAX); } else { rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX); } /* 查找 spi 设备获取设备句柄 */ spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name); if (!spi_dev_w25q) { rt_kprintf("spi sample run failed! can't find %s device!
", name); } else { /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */ rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5); rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x
", id[3], id[4]); /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */ struct rt_spi_message msg1, msg2; msg1.send_buf = &w25x_read_id; msg1.recv_buf = RT_NULL; msg1.length = 1; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = id; msg2.length = 5; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(spi_dev_w25q, &msg1); rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x
", id[3], id[4]); } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample); ```
查看更多
2
个回答
默认排序
按发布时间排序
ggggg
2020-04-04
这家伙很懒,什么也没写!
您好 我用最新的版本的4.0.2源码,添加w25q16flash芯片 drivers目录下 spi目录下的spi_flash_w25qxx.c不会自动生成了,4.0.1版本的源码就可以,请问最新版源码添加spi设备方法有什么不一样了吗?
水蜜桃菌
2020-04-10
这家伙很懒,什么也没写!
>您好 我用最新的版本的4.0.2源码,添加w25q16flash芯片 drivers目录下 spi目录下的spi_flash_w25qxx.c不会 ... 工程的添加路径有没有,sconsscript下的编译时包含路径和上一个版本有没有不同,是不是漏了什么,可以从这几个点去看看
撰写答案
登录
注册新账号
关注者
0
被浏览
2.8k
关于作者
水蜜桃菌
这家伙很懒,什么也没写!
提问
9
回答
10
被采纳
0
关注TA
发私信
相关问题
1
【内核学习】rtthread内核移植记录-STM32F103ZET6-HAL库
2
《内核学习营》+水一方+自用STM32F103VC 板RT-Thread内核移植分享
3
《内核学习营》+水一方+项目中创建标准的 RT-Thread工程
4
内核学习营+坦然+探索者stm32f407板子RT-thread循环点亮led灯
5
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口字符点灯
6
<内核学习营>+坦然+探索者stm32f407板子RT-thread的pwm点灯实验
7
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口实验
8
<内核学习营>+坦然+野火stm32f103板子RT-thread读写SD卡实验
9
<内核学习营>+坦然+探索者stm32f407板子RT-thread的RTC闹钟实验
10
【内核学习营】+王秀峰+led_rgb
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部