ADS1220 STM32硬件SPI驱动程序

前一段时间温故了下标准库,使用的是F1系列芯片,测试程序。

1 硬件部分

1.1 电路

注:该电路只是参考,是我另一个板卡上使用。和本文所使用标准库代码不是一组引脚。

1.2 接线

SCK:ADS1220的串行时钟输入。

DRDY:数据准备就绪,低电平有效。

DOUT:串行数据输出。

DIN:串行数据输入。

CS:片选,低电平有效。

IN0~IN3:电压输入引脚。

VREF:REFP0是正电压输入引脚,REFN0是负电压输入引进。这里只引入了正电压,REFN0接地。

2 程序

2.1 SPI模式

        该器件的SPI兼容串行接口适用于读取转换数据、读写器件配置寄存器以及控制器件工作状态。仅支持SPI1(CPOL=0,CPHA=1)。见官方手册Page34,8.5.1 Serial Interface。

       ADS1220_IOInit()函数包含了IO初始化,SPI初始化以及外部中断引脚初始化。其中SPI1使用的是PB3PB4PB5,需要进行重映射。

IO重映射:GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);   

2.2 多路复用器

      可以测量四路单端信号、双路差分信号、双路单端信号与单路差分信号组合。

       该多路复用器通过配置寄存器的四个位(MUX[3:0])进行配置。见官方手册Page40。

       测量单端信号时,ADC输入(AINN)通过多路复用器内的开关在内部与AVSS相连。

       该多路复用器还可以将两个可编程电流源任意一路引至任意模拟输入或任意基准引脚(REFP0,REFN0)。

       ADC并不能同时采样,切换通道时需要进行切换,重新配置。一个时间只能采样一个输入通道。        

2.3 配置寄存器

SPI是全双工通信,读和写可以使用同一个函数。ADS1220寄存器配置都是8位,在初始化SPI1时,设置数据大小为8bit。在读16位ADC的值时,需要读2次。        

具体配置内容在ads1220_Config.c文件中。

       ADS1220一共有4个配置寄存器。先用SPI写函数进行写寄存器指令,根据官方手册Page36,Table 14,WREG一共8位,高4位固定为0100,低四位rrnn根据使用情况改写。rr=配置寄存器(00~11),nn=配置寄存器数量-1。

       写完写寄存器指令后,再用SPI写函数对寄存器进行配置。

       配置寄存器函数在ads1220.c中的void ADS1220WriteReg(uint8_t RegAddr,uint8_t Num,uint8_t* pData)。

       ads1220_Config.h定义了4个寄存器一些配置参数。

<
  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ADS1256是一款高精度、低功耗的24位模数转换器(ADC),常用于电子测量、仪器仪表、传感器接口等领域。STM32F103是一款基于ARM Cortex-M3内核的微控制器,拥有丰富的外设资源,其中包括SPI接口。 为了驱动ADS1256,我们需要通过SPI接口与其进行通信。以下是基于STM32F103的ADS1256驱动程序示例: 首先,我们需要定义一些常量和变量: ``` #define ADS1256_SPI SPI1 #define ADS1256_CS GPIO_Pin_4 #define ADS1256_START 0x08 #define ADS1256_WAKEUP 0x00 #define ADS1256_RDATA 0x01 #define ADS1256_RDATAC 0x03 #define ADS1256_SDATAC 0x0F #define ADS1256_RREG 0x10 #define ADS1256_WREG 0x50 #define ADS1256_SELFCAL 0xF0 #define ADS1256_SELFOCAL 0xF1 #define ADS1256_SELFGCAL 0xF2 #define ADS1256_SYSOCAL 0xF3 #define ADS1256_SYSGCAL 0xF4 #define ADS1256_SYNC 0xFC #define ADS1256_STANDBY 0xFD #define ADS1256_RESET 0xFE uint8_t ADS1256_Buffer[3]; ``` 这里定义了SPI接口、ADS1256的CS引脚、ADS1256的指令常量以及一个用于缓存数据的数组。 接着,我们需要实现SPI的初始化函数: ``` void ADS1256_SPI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ADS1256_CS; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(ADS1256_SPI, &SPI_InitStructure); SPI_Cmd(ADS1256_SPI, ENABLE); ADS1256_CS_HIGH(); } ``` 该函数首先初始化GPIO和SPI外设,并将ADS1256的CS引脚设置为输出模式。然后设置SPI的工作模式、传输速率等参数,并使能SPI外设。 接下来,我们可以编写一个函数用于向ADS1256发送指令: ``` void ADS1256_SendCommand(uint8_t command) { ADS1256_CS_LOW(); SPI_I2S_SendData(ADS1256_SPI, command); while (SPI_I2S_GetFlagStatus(ADS1256_SPI, SPI_I2S_FLAG_BSY) == SET); ADS1256_CS_HIGH(); } ``` 该函数将ADS1256的CS引脚拉低,发送指令,等待传输完成,然后将CS引脚拉高。 接着,我们可以编写一个函数用于向ADS1256写寄存器: ``` void ADS1256_WriteReg(uint8_t reg, uint8_t data) { ADS1256_CS_LOW(); ADS1256_Buffer[0] = ADS1256_WREG | reg; ADS1256_Buffer[1] = 0x00; ADS1256_Buffer[2] = data; SPI_I2S_SendData(ADS1256_SPI, ADS1256_Buffer[0]); while (SPI_I2S_GetFlagStatus(ADS1256_SPI, SPI_I2S_FLAG_BSY) == SET); SPI_I2S_SendData(ADS1256_SPI, ADS1256_Buffer[1]); while (SPI_I2S_GetFlagStatus(ADS1256_SPI, SPI_I2S_FLAG_BSY) == SET); SPI_I2S_SendData(ADS1256_SPI, ADS1256_Buffer[2]); while (SPI_I2S_GetFlagStatus(ADS1256_SPI, SPI_I2S_FLAG_BSY) == SET); ADS1256_CS_HIGH(); } ``` 该函数首先将ADS1256的CS引脚拉低,然后发送写寄存器指令和寄存器地址。接着,发送两个字节的数据,等待传输完成,最后将CS引脚拉高。 最后,我们可以编写一个函数用于从ADS1256读取数据: ``` int32_t ADS1256_ReadData(void) { uint32_t i; uint32_t timeout = 100000; ADS1256_CS_LOW(); ADS1256_Buffer[0] = ADS1256_RDATA; SPI_I2S_SendData(ADS1256_SPI, ADS1256_Buffer[0]); while (SPI_I2S_GetFlagStatus(ADS1256_SPI, SPI_I2S_FLAG_BSY) == SET); for (i = 0; i < 3; i++) { timeout = 100000; while (SPI_I2S_GetFlagStatus(ADS1256_SPI, SPI_I2S_FLAG_RXNE) == RESET) { if (--timeout == 0) { ADS1256_CS_HIGH(); return 0; } } ADS1256_Buffer[i] = SPI_I2S_ReceiveData(ADS1256_SPI); } ADS1256_CS_HIGH(); return ((int32_t)ADS1256_Buffer[0] << 16) | ((int32_t)ADS1256_Buffer[1] << 8) | ((int32_t)ADS1256_Buffer[2]); } ``` 该函数首先将ADS1256的CS引脚拉低,然后发送读数据指令。接着,循环读取三个字节的数据,等待传输完成,最后将CS引脚拉高。返回值为读取到的数据的24位有符号整数值。 以上就是基于STM32F103的ADS1256驱动程序示例。需要注意的是,该示例仅提供了基本的SPI通信和指令发送功能,具体的应用需要根据实际情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘零翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值