资源简介
这是基于 RT-Thread 4.0.2 版本基础移植 ADS 1256 驱动程序测试用例在 .c 文件最后部分

代码片段和文件信息
#include “drv_ads1256.h“
#include “drv_spi.h“
/*
工作思路:
1 单独一个工作线程
2 启动 50ms 软定时器 负责启动该线程
3 该线程下属有两个驱动程序文件 A 工作完成启动 B
4 通过使能和释放 CS 进行程序切换
5 完成工作之后写入指定内存交由主程序做判断然后线程挂起
6 主线程每秒发送和存储一次数据(can uart)
*/
/*
注意: SPI 和 中断都使用了系统锁所以不能在中断中使用 SPI (除非使用 IO 模拟 SPI 才可以)
鉴于任务需求只要采集16次之后就可以停止工作,则改为轮询方式进行
注意: ADS1256 自带自动校准可能导致检测到的电压被均值,也就是高的被拉低,低的被拉高以便值接近
*/
/*
ADS1256基本特性:
1、模拟部分供电5V;
2、SPI数字接口电平:3.3V
3、PGA设置范围: 1、2、4、8、16、32、64、
4、参考电压2.5V (推荐缺省的,外置的)
5、输入电压范围:PGA = 1 时 可输入正负5V
6. 自动校准 (当设置了PGABUF使能、数据采样率时,会启动自校准)
7. 输入的缓冲器可设置启用和关闭(一般选启用)
外部晶振频率 = 7.68MHz
时钟频率 tCLK = 1/7.68M = 0.13uS
输出数据周期 tDATA = 1 / 30K = 0.033mS (按30Ksps计算)
对SPI的时钟速度要求: (ads1256.pdf page 6)
最快 4个tCLK = 0.52uS
最慢 10个tDATA = 0.3mS (按 30Ksps 计算)
SCL高电平和低电平持续时间最小 200ns
RREG WREG RDATA 命令之后,需要延迟 4 * tCLK = 0.52uS;
RDATAC RESET SYNC 命令之后,需要延迟 24 * tCLK = 3.12uS;
实际测试,在3.3V上电后 及时不做任何配置,ADS125的DRDY 口线即开始输出脉冲信号(2.6us高33.4低,频率30KHz)
*/
/*
调试记录
(1) 设置寄存器时,SCK过快导致芯片不能每次都收到数据。原因: 发送的相邻的字节之间需要延迟一小段时间.
(2) 连续复位CPU时,偶尔出现芯片输出采样率异常。
*/
#define SPI_BUS_NAME “spi1“
#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 RST0
/* 4194303 = 2.5V 这是理论值,实际可以根据2.5V基准的实际值进行公式矫正 */
//校准方法: 数字电源 2.5V 开启自校准 取当前采集到 2.5V 的值
#define AD_2_5V_MASKVALUE 4194303
static struct rt_spi_device *spi_dev_ads1256;
ADS1256_VAR_T g_tADS1256;
/************** 声明区 declared section ************/
//读寄存器值
static rt_uint8_t rt_hw_ads1256_readReg(rt_uint8_t _RegID);
//写寄存器值
static void rt_hw_ads1256_setReg(rt_uint8_t _RegID rt_uint8_t _RegValue);
//写单字节命令
static void rt_hw_ads1256_writeCmd(const rt_uint8_t _cmd);
//设置差分通道采集
static void rt_hw_ads1256_setDiffChannel(rt_uint8_t _ch);
//设置单通道采集
static void rt_hw_ads1256_setChannel(rt_uint8_t _ch);
//读取 ADC 数据
static rt_int32_t rt_hw_ads1256_readData(void);
//由外部中断调用的 ADC 采集程序
static void rt_hw_ads1256_getISRValue(void);
//读取 DRDY 引脚电平 低电平有效 1 表示转换完成 0 表示需要等待
static rt_uint8_t rt_hw_ads1256_readDRDY(void);
//复位时缺省值
static const uint8_t s_tabDataRate[ADS1256_DRATE_MAX] =
{
0xF00xE00xD00xC00xB00xA1
0x920x820x720x630x530x43
0x330x200x130x03
};
/******************* 函数区 Function Section*******/
/* 中断回调函数 */
rt_uint8_t readStatus = 0;
void beep_on(void *args)
{
readStatus = 1;
}
/*
@brief: IO 引脚初始化
*/
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);
rt_pin_attach_irq(SPI_DRDY0 PIN_IRQ_MODE_FALLING beep_on RT_NULL);
}
/*
@brief: ADS1256 设备初
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 16236 2019-10-31 19:58 drv_ads1256.c
文件 3041 2019-10-31 14:13 drv_ads1256.h
相关资源
- I2C读写AT24C02 基于STM32F103 cube116540
- 基于stm32f103ve的程序——跑马灯实验
- 基于STM32RCT6的步进电机驱动程序
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- STM32F103 CC2500完整驱动(模拟SPI)
- AD7606采集程序
- stm32 用SPI 方式读写 SDHC
- stm32通过DMA方式采集ADC数据
- 意法半导体STM全系列微控制器STM32ST
- 基于STM32芯片的SX1278 驱动 LORA.rar
- STM32的PCB封装库,以及原理图库,48
评论
共有 条评论