20191027(32)RT-Thread SPI 设备挂载——ADS1256 后续提供具体实现源码(stm32f407)
目的
1 实现 ADS 1256 采集芯片在 RT-Thread 上的应用
2 了解 SPI 挂载的方式
特别说明
在中断 ISR 中调用 SPI 发送数据相关函数,导致 assertion 报错。Function[rt_mutex_take] shall not be used in ISR,assertion failed at function:rt_mutex_take, line number:656
RT-Thread SPI 和 I2C 数据收发相关函数会调用 rt_mutex_take(),此函数不能再中断函数中使用
官方外设精品文章链接
正文
了解 SPI
SPI:
1 串行外设接口总线(SPI)最早由Motorola首先提出的全双工三线同步串行外围接口(SCK, MISO 主入从出, MOSI 主出从入)
2 采用 主从模式 支持一对多
3 通过 CS 片选脚来确定工作对象(大多是 CS 片选脚都是拉低有效,在RTOS 中如果是拉高有效需要另外设置)
设置 SPI 参数(需要查看器件数据手册确定)
1 时钟速率
2 数据数据格式 (MSB 高位在前) / (LSB 低位在前)
3 时钟极性 CPOL 和 时钟相位 CPHA(CubeMX 中的 1边沿 / 2边沿就是对应数字 0 / 1
参考 SPI 参考原网址
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿
了解 RTOS 下的 SPI 接口(关键 3 个)
1 挂载 SPI (默认在 SPI 总线会自动注册, 只需在 env 中集合 STM32CubeMX 配置即可
2 自定义消息
3 使用官方封住好的接口
4 总线使用和片选设定
5 配置
挂载 SPI
非 STM32 使用 rt_spi_bus_attach_device() 需求启动总线但是没有具体实验不再深入说明
STM32 使用 rt_hw_spi_device_attach()
__HAL_RCC_GPIOB_CLK_ENABLE(); //对应 GPIOB rt_hw_spi_device_attach("spi1", "spi10", GPIOB, GPIO_PIN_14); // GPIOB 和 GPIO_PIN_14 是用来说明 CS 所在 IO 引脚 B14 脚//特别说明 GPIO_PIN_14 与 PIN 中引脚使用方式略微不同的//GPIO_PIN_0 ~ GPIO_PIN_15 //假设现在 CS =》 PA4 ----> GPIOA, GPIO_PIN_4 即可//"spi1" 总线名词//"spi10" 是指 spi1 下的第一个设备,具体请查看官方文档//"spi11" 是指 spi1 下的第二个设备
自定义消息
关键点:
1 第一个消息块必须使能(cs_take = 1) CS脚 和 最后一个消息块必须释放(cs_release = 1) CS 脚
2 8bit视为 1 个字节, 16bit 视为 2 个字节
3 假设有 5 个 8bit 数据接收, length = 5
4 不在一个消息块上同时收发,发和收需要分成 2 个或者使用 官方包装好的(官方自动会在使用前后使能和释放)
struct rt_spi_message msg1, msg2, msg3;
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 = &w25x_xxx;
msg2.recv_buf = RT_NULL;
msg2.length = 1;
msg2.cs_take = 0;
msg2.cs_release = 0;
msg2.next = RT_NULL; msg3.send_buf = RT_NULL;
msg3.recv_buf = id;
msg3.length = 5;
msg3.cs_take = 0;
msg3.cs_release = 1;
msg3.next = RT_NULL; rt_spi_transfer_message(spi_dev_w25q, &msg1);
官方封装库
只说明一个 rt_spi_send_then_recv
其特点就是 也是利用 上面的消息块分装的,但是使用前后会 自动使能和释放片选
其他
1 避免被不同线程打断 SPI 传输需要,先对 SPI 获取使用权
rt_spi_take_bus()
/ 使用完成之后释放rt_spi_release_bus()
2 不同从设备使用同一 SPI 需要指定对应片选引脚有效rt_spi_take()
/ 使用完成之后释放rt_spi_release()
3 新增信息内容rt_spi_transfer_message()
配置 SPI
特别说明:
1 具体 SPI 频率是根据自动选取 系统时钟 / 分频 满足要求的一个
(stm32f407 假设 1.92 最大 84M / 64 = 1.3125 M/s 这将是设定的实际频率)
ADS1256 部分例程
#define SPI_ADS1256_DEVICE_NAME "spi10"
#define SPI_CS0 GPIO_PIN_4 //PA4 CS0
#define SPI_CS0_GPIO GPIOA
#define SPI_SYNC0 GET_PIN(A, 8) //PA8 SYNC0
#define SPI_DRDY0 GET_PIN(C, 4) //PC4 DRDY0
#define SPI_RST0 GET_PIN(C, 5) //PC5 RST0static struct rt_spi_device *spi_dev_ads1256;static void rt_hw_ads1256_gpio(void) {rt_pin_mode(SPI_SYNC0, PIN_MODE_OUTPUT);rt_pin_mode(SPI_RST0, PIN_MODE_OUTPUT);rt_pin_mode(SPI_CS0, PIN_MODE_OUTPUT);rt_pin_mode(SPI_DRDY0, PIN_MODE_INPUT);rt_pin_write(SPI_SYNC0, PIN_HIGH);rt_pin_write(SPI_RST0, PIN_HIGH);rt_pin_write(SPI_CS0, PIN_HIGH);
}static int rt_hw_ads1256_init(void)
{rt_err_t res;//挂载设备__HAL_RCC_GPIOA_CLK_ENABLE();res = rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_ADS1256_DEVICE_NAME, SPI_CS0_GPIO, SPI_CS0); //挂载到 SPI 总线if (RT_EOK != res) {return -RT_ERROR;}//查找设备spi_dev_ads1256 = (struct rt_spi_device *)rt_device_find(SPI_ADS1256_DEVICE_NAME);//配置设备{struct rt_spi_configuration cfg;cfg.data_width = 8;cfg.mode = RT_SPI_MASTER | RT_SPI_MSB | RT_SPI_MODE_1;cfg.max_hz = 1920 * 1000; //1.92 Mrt_spi_configure(spi_dev_ads1256, &cfg);}//ADS IO 配置rt_hw_ads1256_gpio();// 非必须return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_ads1256_init); //系统自动注册/*
@brief: 读取 ADS 1256 的设备 ID
@process: 当打印值为 0x30 时则说明硬件连接正常(具体可查看手册)
*/
static void rt_hw_ads1256_readChipID(void) {rt_uint8_t cmd[] = { 0x10, 0x00}; // 0x10 是读寄存器 0x00 读一个寄存器rt_uint8_t id = 0;//发送数据后接收数据rt_spi_send_then_recv(spi_dev_ads1256, cmd, 2, &id, 1); //发送 2 指令 接收 1 指令rt_kprintf(" read ADS1256 ID: %x \n", id); // 接收到 0x30 表示硬件通讯正常}
MSH_CMD_EXPORT(rt_hw_ads1256_readChipID, spi ads1256 sample);
20191027(32)RT-Thread SPI 设备挂载——ADS1256 后续提供具体实现源码(stm32f407)相关推荐
- java计算机毕业设计机械生产企业办公设备管理系统MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计机械生产企业办公设备管理系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计机械生产企业办公设备管理系统MyBatis+系统+LW文档+源码+调试部署 本源 ...
- 计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调 ...
- Java毕设项目中学后勤设备保修维护管理系统计算机(附源码+系统+数据库+LW)
Java毕设项目中学后勤设备保修维护管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...
- 家园垃圾分类php源码,PHP垃圾分类设备机器类企业网站整站源码(带手机移动端) dedecms内核...
[温馨提示]源码包解压密码:www.youhutong.com 资源描述 PHP垃圾分类设备机器类企业网站整站源码(带手机移动端) dedecms内核 源码介绍: 采用织梦最新内核开发的模板,该模板属 ...
- 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)
最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...
- rtthread工业使用_RT Thread SPI设备 使用
后记: 之前,我把SPI的片选在Cubemx中配置成了SPI_NSS. 现在我给它改为了GPIO_OUTPUT. 同时参考了别人的类似的一个操作无线模块(采用SPI设备驱动)的例子程序(清楚了RTT ...
- java Thread sleep 和obj.wait,以及sychronized,minor源码
sleep()方法是Thread类里面的,主要的意义就是让当前线程停止执行,让出cpu给其他的线程,但是不会释放对象锁资源以及监控的状态,当指定的时间到了之后又会自动恢复运行状态. wait()方法是 ...
- 04【Verilog实战】SPI协议底层硬件接口设计(附源码RTL/TB)
脚 本:makefile 工 具:vcs 和 verdi 写在前面 这个专栏的内容记录的是个人学习过程,博文中贴出来的代码是调试前的代码,方便bug重现. 调试后的程序提供下载,[下载地址] 发现 ...
- 39. 实战:基于api接口实现视频解析播放(32接口,窗口化操作,可导出exe,附源码)
目录 前言 目的 思路 代码实现 需要导入的模块 1. 导入解析网站列表,实现解析过程 2. 设计UI界面 3. 设置窗口居中和循环执行 4. 注意事项 完整源码 运行效果 总结 前言 本节将类似34 ...
最新文章
- Ascend Pytorch算子功能验证
- MaskedTextBox
- 好程序员大数据独家解析-hadoop五大节点
- 【NLP】万字长文带你解读『虚假新闻检测』最新进展
- c语言 变量 定义 使用,C语言为什么要规定对所用到的变量要“先定义,后使用”...
- (Ⅰ)基于Hexo+GitHub Page搭建博客,绑定域名及备份
- mysql在mac上的坑
- 冷藏温度范围_食品冷藏冷冻温度要求与管理规范
- php 数组转xml 函数,PHP数组和XML相互转换的函数
- 容器编排技术 -- Kubernetes kubectl delete 命令详解
- dubbo 自定义线程池
- c字段和属性的区别_如何将唯一属性类字段设置为不允许重复?
- Mysql的my.cnf配置文件详情
- 灵感分享| 实例UI组件的设计风格
- Windows查看端口占用
- 如何在 30 天内重新设计整个应用程序?
- 无锁并发框架Disruptor学习入门
- 统计信号处理基础——估计与检测理论 Kay
- 【项目|ICT】决赛记录
- 第十节、grep、find、sed和awk
热门文章
- 数据相关的在职研究生_西南政法大学拟清理20名博士研究生的学籍!
- python 爬取腾讯漫画
- [积水成渊]asp.net中HiddenField的使用
- 【LOJ6713】「EC Final 2019」狄利克雷 k 次根 加强版(狄利克雷生成函数)
- 如何统一设置或者修改Excel表格中图表样式
- v2rayN断网修复
- locust工具学习笔记(三)-Tasks属性、tag修饰符、TaskSet类
- realme刷机鸿蒙教程,realmeX一键解锁BL教程(realme手机解锁BL详解教程)
- 万花哥特体繁黑执事中文字体_50多种免费的高质量哥特式和恐怖字体
- 小博无线技术团队使用的编程语言