最近做项目用到了,用来做热电偶温度采集,主控为 。记录一下在编写驱动时遇到的问题和解决方法 。
在编写驱动前,要认真阅读数据手册,如果芯片厂商给出了相关解决方案,最好根据其方案进行设计 。
《数据手册》,《简单的热电偶测量解决方案》,主要依据这两个手册完成硬件电路和驱动程序的编写 。
1 硬件设计
文章插图
上图就是TI给出的硬件设计 。
2 驱动程序设计 2.1 的SPI时序
使用的SPI总线,因此驱动还是比较好写的 。
最开始写的时候,因为没有认真看数据手册,采集到的数据一直不正确,最后仔细看了一下时序图,发现是由于在 CS 引脚拉低后没有延时就开始采集数据造成的 。详见下图:
文章插图
文章插图
在 CS 引脚拉低后,要最少延时100ns,实测STM32则要延时100us(没有继续测试,也许可以更短) 。
2.2 配置STM32的SPI引脚
STM32的SPI引脚配置时,可以使用8位帧数据格式,也可以使用16位帧数据格式,数据为MSB优先,空闲时SCLK保持低电平,下降沿时对数据采样 。
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//SCLK空闲状态低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);
2.3 数据采集 2.3.1 获取ADC数据
由于低功耗的要求,被配置为单次模式 。以下说明均按照单次模式 。
文章插图
数据手册上对数据传输的说明如下:
在单次转换模式和连续转换模式下,均以相同方式写入或读取数据,无需发出任何命令 。的工作模式通过配置寄存器中的 MODE 位进行选择 。
将 MODE 位置为 0 可使器件在连续转换模式下工作 。在连续转换模式下,器件连续启动新的转换,即使 CS 处于高电平也是如此 。
将 MODE 位置为 1 可启动单次转换模式 。在单次转换模式下,只有向 SS 位写入 1 时才会启动新的转换 。
始终对转换数据进行缓冲并在新转换数据替换前始终保留当前数据 。因此,可随时读取数据,无需担心数据损坏 。当 DOUT/DRDY 置为低电平时,指示新转换数据已就绪,可通过移出 DOUT/DRDY 中的数据进行读取 。
还可以在同一数据传输周期内直接回读配置寄存器设置 。完整的数据传输周期由 32 位( 使用配置寄存器数据回读) 或 16 位( 仅在 CS 线路受控且永久置为低电平时使用) 组成 。
在编写驱动的时候,参考了TI给出的的驱动程序,采用32位完整传输周期 。
文章插图
32 位数据传输周期中的数据由四个字节组成:两字节用于转换结果,另外两字节用于配置寄存器回读 。
我个人认为每个周期中的DATA是上一次的转换结果,因此要获取当前时刻的转换结果需要写入四次数据,头两次写入有效的寄存器配置,启动转换,后两次则随意写入无效数据读取转换结果 。
在读取转换结果之前需要判断是否完成了数据转换 。这里就有两种方式:
- STM32 | 外部检测0V 5V电平信号输入的故障检测及排查
- 学习和计算时特别常用的三角公式
- RT9293和boost电路分析
- 某CCF C会议对国内和国外作者实行两套标准, 引27%+中稿者发声!
- 基于手势识别的PPT控制
- 图文、示例 【绘制】HTML5 Canvas线段端点和连接点的绘制
- 项目经理,请打造和升级你的操作系统
- dma 和 cache的一致性
- ROS 1 和 ROS 2 的前世、今生、安装使用说明与资料汇总
- 一 javaweb总结--文件上传和下载