- 最近在用ADS1220 做数据转换,但是转换的过程中转换几次就死机,不知道为什么,程序代码如下,MUC用TMS320F28335:
#include "ADS1220.h"
#include "math.h"
void ADS1220_Reset(void) //ADS1220复位,引脚配置已经在GPIO初始化中配置完成
{
uint16 dtime;
uint8 k,time=2;
ADS1220_CS_L; for(k=time;k>0;k--);
ADS1220_Wbyte(0,ADS1220_CMD_RESET); //发复位命令
for(dtime=20000;dtime>0;dtime--); //等待至少50us+32*t(CLK)
ADS1220_CS_H; for(k=time;k>0;k--);
}
void ADS1220_Start(void) //ADS1220启动转换
{
ADS1220_Wbyte(1,ADS1220_CMD_START); //发启动命令
}
void ADS1220WriteRegister(int StartAddress, int NumRegs, uint8 * pData)
{
unsigned int i;
uint8 j,time=2;
ADS1220_CS_L; //片选使能
for(j=time;j>0;j--);
ADS1220_Wbyte(0,ADS1220_CMD_WREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03))); //发送命令
for (i=0; i< NumRegs; i++) //写寄存器数据
{
ADS1220_Wbyte(0,*pData++);
}
ADS1220_CS_H; //片选禁止
for(j=time;j>0;j--);
}
void ADS1220ReadRegister(int StartAddress, int NumRegs, uint8 * pData)
{
unsigned int i;
uint8 j,time=2;
ADS1220_CS_L; //片选使能
for(j=time;j>0;j--);
ADS1220_Wbyte(0,ADS1220_CMD_RREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03))); //发送命令
for (i=0; i< NumRegs; i++) //读取寄存器数据
{
*pData++ = ADS1220_Rbyte(0);
}
ADS1220_CS_H; //片选禁止
for(j=time;j>0;j--);
}
void ADS1220_Wbyte(uint8 CS_choose,uint8 wdata) //写1个字节到 ADS1220
{
uint8 i,j,time=2;
if(CS_choose){ADS1220_CS_L;for(j=time;j>0;j--);} //CS enable
ADS1220_CLK_L;for(j=time;j>0;j--); //时钟拉低
for(i=0;i<8;i++)
{
ADS1220_CLK_H;
for(j=time;j>0;j--);
if(wdata&0x80)ADS1220_DIN_H;
else ADS1220_DIN_L;
wdata <<= 1;
for(j=time;j>0;j--); //延时50ns以上,在flash中运行时一个时钟周期至少是10ns
ADS1220_CLK_L;
for(j=time;j>0;j--); //延时25ns以上, SCLK周期至少150ns
}
if(CS_choose){ADS1220_CS_H; for(j=time;j>0;j--);} //CS disable
}
uint8 ADS1220_Rbyte(uint8 CS_choose) //从ADS1220读1个字节,上升沿移出数据
{
uint8 i,j,rdata,time=2;
if(CS_choose){ADS1220_CS_L; for(j=time;j>0;j--);} //CS enable
ADS1220_CLK_L;for(j=time;j>0;j--); //时钟拉低
for(i=0;i<8;i++)
{
ADS1220_CLK_H;
for(j=time;j>0;j--);
rdata<<= 1;
if(ADS1220_DOUT)rdata|=0x01;
ADS1220_CLK_L;
for(j=time;j>0;j--);
}
if(CS_choose){ADS1220_CS_H;for(j=time;j>0;j--);} //CS disable
return rdata;
}
void ADS1220_SPIWrite(uint8 *pData, uint8 Bytes) //SPI写函数
{
uint8 i,k,time=2;
ADS1220_CS_L; for(k=time;k>0;k--); //CS enable
for(i=0; i0;k--); //CS disable
}
void ADS1220_SPIRead(uint8 *pData, uint8 Bytes) //SPI读函数
{
uint8 i,k,time=2;
ADS1220_CS_L; for(k=time;k>0;k--); //CS enable
for(i=0; i0;k--); //CS disable
}
void ADS1220_Configuration(void) //ADS1220 Initial Configuration
{
uint8 wdata;
wdata=ADS1220_GAIN_128; //放大增益设置为128
ADS1220WriteRegister(ADS1220_0_REGISTER, 0x01, &wdata); //写寄存器0,配置为, AINp=AIN0, AINn=AIN1, 增益为128
wdata=ADS1220_DR_1000; //数据速率1000SPS
//wdata|=ADS1220_continuity; //连续转换
ADS1220WriteRegister(ADS1220_1_REGISTER, 0x01, &wdata); //写寄存器1,数据速率1000SPS, 正常模式, 连续转换, 禁用温度传感器, 关断电流源
//ADS1220_Start(); //ADS1220 Start Conversion
}
uint32 ADS1220_R_Configuration(void) //ADS1220 Initial Configuration
{
uint8 rdata;
uint32 x;
ADS1220ReadRegister(ADS1220_1_REGISTER, 1, &rdata); //读寄存器1的值
x=rdata;
x=x*1000; //如果用x=Temp*1000, 结果就错误
ADS1220ReadRegister(ADS1220_0_REGISTER, 1, &rdata); //读寄存器0的值
x=x+rdata;
return x;
}
long ADS1220_readData(void) //读取转换数据
{ //正满量程0x7FFFFF,负满量程0x800000
uint16 dtime=0;
uint8 k,time=2; //ADS1220以二进制补码形式提供24位数据,正数的原码、反码、补码相同,负数的补码:原码除符号位外的所有位取反
long Ldata,LD1,LD2,LD3; //负数的原码是对应的正数的原码将最高位置1(符号位),负数的反码是除符号位其余位取反,负数的补码是反码加1
//uint8 cmd = ADS1220_CMD_RDATA;
//ADS1220_SPIWrite(&cmd, 1); //发读取数据命令
dtime=0;
while(ADS1220_DRDY) //等待变低
{
dtime++;
if(dtime>=8000)
{
ADS1220_Reset();
ADS1220_Configuration();
goto the_end;
//break;
}
}
ADS1220_CS_L; for(k=time;k>0;k--); //CS enable
LD1=ADS1220_Rbyte(0);
LD2=ADS1220_Rbyte(0);
LD3=ADS1220_Rbyte(0);
ADS1220_CS_H; for(k=time;k>0;k--); //CS disable
Ldata=(LD1<<16)+(LD2<<8)+LD3;
if(Ldata & 0x00800000) //补码扩展符号位(即24位补码变为32位补码)
{
Ldata |= 0xFF000000;
}
the_end:
return Ldata;
}
void main()
{
// 系统初始化↓0
InitSysCtrl(); // Step1:初始化系统,PLL、WatchDog、enable Peripheral Clocks。在 DSP2833x_SysCtrl.c 文件中。
GPIO_initialization(); // Step2:初始化 GPIO。
DINT; // Step3:清除所有中断和初始化 PIE(中断)向量表,禁止全局 CPU 中断。
InitPieCtrl(); // 初始化 PIE(中断)向量表,禁止所有 PIE 中断,清除所有中断标志位。在 DSP2833x_PieCtrl.c 文件中。
IER = 0x0000; // 禁止 CPU 中断
IFR = 0x0000; // 清除所有 CPU 中断标志位
InitPieVectTable(); // 初始化 PIE(中断)向量表。在 DSP2833x_PieVect.c 文件中。
// 用JTAG烧写程序用,仿真时屏蔽↓
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
// 用JTAG烧写程序用,仿真时屏蔽↑
//定时器初始化↓
InitCpuTimers(); // 初始化所有定时器,在 DSP2833x_CpuTimers.c 中
Timer_Config_And_Start(0 , 1000 , Timer0_Interrupt); // 配置和启动定时器0,第二个参数为定时间隔,单位:us
// 定时器初始化↑
// EEPROM初始化↓
I2C_Initialization(); //I2C 初始化配置函数,I2C时钟和引脚配置已经在GPIO初始化中配置完成
// EEPROM初始化↑
MAX7219_initialization();
EINT; //打开中断
PLED_ON; //电源指示灯亮
eeprom_read_set_data(); //eeprom 读数据
PLED_OFF; //电源指示灯灭
ADS1220_Reset(); //ADS1220复位,引脚配置已经在GPIO初始化中配置完成
BEEP_ON;
for(Global_ulong_time=1000000;Global_ulong_time>0;Global_ulong_time--); //等待400ms
BEEP_OFF;
ADS1220_Configuration(); //ADS1220 Initial Configuration
for(Global_ulong_time=10000;Global_ulong_time>0;Global_ulong_time--);
/////////////////////////////////////////////////////////////////
while(1)
{
ADS1220_Start();
Global_AD_code=ADS1220_readData(); //读取转换数据
Display_ADcode(Global_AD_code); //显示AD码
LED1_TOGGLE;
}
}
0
|
2个回答
|
|
|