資源簡介
這是基于 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
評論
共有 條評論