目的

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)相关推荐

  1. java计算机毕业设计机械生产企业办公设备管理系统MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计机械生产企业办公设备管理系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计机械生产企业办公设备管理系统MyBatis+系统+LW文档+源码+调试部署 本源 ...

  2. 计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调 ...

  3. Java毕设项目中学后勤设备保修维护管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目中学后勤设备保修维护管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  4. 家园垃圾分类php源码,PHP垃圾分类设备机器类企业网站整站源码(带手机移动端) dedecms内核...

    [温馨提示]源码包解压密码:www.youhutong.com 资源描述 PHP垃圾分类设备机器类企业网站整站源码(带手机移动端) dedecms内核 源码介绍: 采用织梦最新内核开发的模板,该模板属 ...

  5. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  6. rtthread工业使用_RT Thread SPI设备 使用

    后记: 之前,我把SPI的片选在Cubemx中配置成了SPI_NSS. 现在我给它改为了GPIO_OUTPUT.  同时参考了别人的类似的一个操作无线模块(采用SPI设备驱动)的例子程序(清楚了RTT ...

  7. java Thread sleep 和obj.wait,以及sychronized,minor源码

    sleep()方法是Thread类里面的,主要的意义就是让当前线程停止执行,让出cpu给其他的线程,但是不会释放对象锁资源以及监控的状态,当指定的时间到了之后又会自动恢复运行状态. wait()方法是 ...

  8. 04【Verilog实战】SPI协议底层硬件接口设计(附源码RTL/TB)

    脚  本:makefile 工  具:vcs 和 verdi 写在前面 这个专栏的内容记录的是个人学习过程,博文中贴出来的代码是调试前的代码,方便bug重现. 调试后的程序提供下载,[下载地址] 发现 ...

  9. 39. 实战:基于api接口实现视频解析播放(32接口,窗口化操作,可导出exe,附源码)

    目录 前言 目的 思路 代码实现 需要导入的模块 1. 导入解析网站列表,实现解析过程 2. 设计UI界面 3. 设置窗口居中和循环执行 4. 注意事项 完整源码 运行效果 总结 前言 本节将类似34 ...

最新文章

  1. Ascend Pytorch算子功能验证
  2. MaskedTextBox
  3. 好程序员大数据独家解析-hadoop五大节点
  4. 【NLP】万字长文带你解读『虚假新闻检测』最新进展
  5. c语言 变量 定义 使用,C语言为什么要规定对所用到的变量要“先定义,后使用”...
  6. (Ⅰ)基于Hexo+GitHub Page搭建博客,绑定域名及备份
  7. mysql在mac上的坑
  8. 冷藏温度范围_食品冷藏冷冻温度要求与管理规范
  9. php 数组转xml 函数,PHP数组和XML相互转换的函数
  10. 容器编排技术 -- Kubernetes kubectl delete 命令详解
  11. dubbo 自定义线程池
  12. c字段和属性的区别_如何将唯一属性类字段设置为不允许重复?
  13. Mysql的my.cnf配置文件详情
  14. 灵感分享| 实例UI组件的设计风格
  15. Windows查看端口占用
  16. 如何在 30 天内重新设计整个应用程序?
  17. 无锁并发框架Disruptor学习入门
  18. 统计信号处理基础——估计与检测理论 Kay
  19. 【项目|ICT】决赛记录
  20. 第十节、grep、find、sed和awk

热门文章

  1. 数据相关的在职研究生_西南政法大学拟清理20名博士研究生的学籍!
  2. python 爬取腾讯漫画
  3. [积水成渊]asp.net中HiddenField的使用
  4. 【LOJ6713】「EC Final 2019」狄利克雷 k 次根 加强版(狄利克雷生成函数)
  5. 如何统一设置或者修改Excel表格中图表样式
  6. v2rayN断网修复
  7. locust工具学习笔记(三)-Tasks属性、tag修饰符、TaskSet类
  8. realme刷机鸿蒙教程,realmeX一键解锁BL教程(realme手机解锁BL详解教程)
  9. 万花哥特体繁黑执事中文字体_50多种免费的高质量哥特式和恐怖字体
  10. 小博无线技术团队使用的编程语言