資源簡(jiǎn)介
這是基于 RT-Thread 4.0.2 版本基礎(chǔ)移植 ADS 1256 驅(qū)動(dòng)程序測(cè)試用例在 .c 文件最后部分

代碼片段和文件信息
#include?“drv_ads1256.h“
#include?“drv_spi.h“
/*
工作思路:
1?單獨(dú)一個(gè)工作線程
2?啟動(dòng)?50ms?軟定時(shí)器?負(fù)責(zé)啟動(dòng)該線程
3?該線程下屬有兩個(gè)驅(qū)動(dòng)程序文件?A?工作完成啟動(dòng)?B?
4?通過使能和釋放?CS?進(jìn)行程序切換
5?完成工作之后寫入指定內(nèi)存交由主程序做判斷然后線程掛起
6?主線程每秒發(fā)送和存儲(chǔ)一次數(shù)據(jù)(can?uart)
*/
/*
注意:?SPI?和?中斷都使用了系統(tǒng)鎖所以不能在中斷中使用?SPI?(除非使用?IO?模擬?SPI?才可以)
鑒于任務(wù)需求只要采集16次之后就可以停止工作,則改為輪詢方式進(jìn)行
注意:?ADS1256?自帶自動(dòng)校準(zhǔn)可能導(dǎo)致檢測(cè)到的電壓被均值,也就是高的被拉低,低的被拉高以便值接近
*/
/*
ADS1256基本特性:
1、模擬部分供電5V;
2、SPI數(shù)字接口電平:3.3V
3、PGA設(shè)置范圍:?1、2、4、8、16、32、64、
4、參考電壓2.5V?(推薦缺省的,外置的)
5、輸入電壓范圍:PGA?=?1?時(shí)?可輸入正負(fù)5V
6.?自動(dòng)校準(zhǔn)?(當(dāng)設(shè)置了PGABUF使能、數(shù)據(jù)采樣率時(shí),會(huì)啟動(dòng)自校準(zhǔn))
7.?輸入的緩沖器可設(shè)置啟用和關(guān)閉(一般選啟用)
外部晶振頻率?=?7.68MHz
時(shí)鐘頻率?tCLK?=?1/7.68M?=?0.13uS
輸出數(shù)據(jù)周期?tDATA?=??1?/?30K?=?0.033mS??(按30Ksps計(jì)算)
對(duì)SPI的時(shí)鐘速度要求:?(ads1256.pdf?page?6)
最快?4個(gè)tCLK?=?0.52uS
最慢?10個(gè)tDATA?=?0.3mS?(按?30Ksps?計(jì)算)
SCL高電平和低電平持續(xù)時(shí)間最小?200ns
RREG?WREG?RDATA?命令之后,需要延遲?4?*?tCLK?=?0.52uS;
RDATAC?RESET?SYNC?命令之后,需要延遲?24?*?tCLK?=?3.12uS;
實(shí)際測(cè)試,在3.3V上電后?及時(shí)不做任何配置,ADS125的DRDY?口線即開始輸出脈沖信號(hào)(2.6us高33.4低,頻率30KHz)
*/
/*
調(diào)試記錄
(1)?設(shè)置寄存器時(shí),SCK過快導(dǎo)致芯片不能每次都收到數(shù)據(jù)。原因:?發(fā)送的相鄰的字節(jié)之間需要延遲一小段時(shí)間.
(2)?連續(xù)復(fù)位CPU時(shí),偶爾出現(xiàn)芯片輸出采樣率異常。
*/
#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??這是理論值,實(shí)際可以根據(jù)2.5V基準(zhǔn)的實(shí)際值進(jìn)行公式矯正?*/
//校準(zhǔn)方法:?數(shù)字電源?2.5V?開啟自校準(zhǔn)?取當(dāng)前采集到?2.5V?的值
#define?AD_2_5V_MASKVALUE?4194303
static?struct?rt_spi_device?*spi_dev_ads1256;
ADS1256_VAR_T?g_tADS1256;
/**************?聲明區(qū)?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);
//寫單字節(jié)命令
static?void?rt_hw_ads1256_writeCmd(const?rt_uint8_t?_cmd);
//設(shè)置差分通道采集
static?void?rt_hw_ads1256_setDiffChannel(rt_uint8_t?_ch);
//設(shè)置單通道采集
static?void?rt_hw_ads1256_setChannel(rt_uint8_t?_ch);
//讀取?ADC?數(shù)據(jù)
static?rt_int32_t?rt_hw_ads1256_readData(void);
//由外部中斷調(diào)用的?ADC?采集程序
static?void?rt_hw_ads1256_getISRValue(void);
//讀取?DRDY?引腳電平?低電平有效?1?表示轉(zhuǎn)換完成?0?表示需要等待
static?rt_uint8_t?rt_hw_ads1256_readDRDY(void);
//復(fù)位時(shí)缺省值
static?const?uint8_t?s_tabDataRate[ADS1256_DRATE_MAX]?=
{
0xF00xE00xD00xC00xB00xA1
0x920x820x720x630x530x43
0x330x200x130x03
};
/*******************?函數(shù)區(qū)?Function?Section*******/
/*?中斷回調(diào)函數(shù)?*/
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?設(shè)備初
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????16236??2019-10-31?19:58??drv_ads1256.c
?????文件????????3041??2019-10-31?14:13??drv_ads1256.h
評(píng)論
共有 條評(píng)論