TI论坛
直播中

名士流

9年用户 984经验值
私信 关注
[问答]

用ADS1220做数据转换,转换几次就死机是为什么?


  • 最近在用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;
    }
    }

回帖(2)

杨兰兰

2024-12-4 09:31:01
转换几次就死机, 是 MCU 死机吗,还是只是不转换了? 感觉最大可能性还是与通信时序有关
举报

张勇

2024-12-4 11:49:59
从您提供的代码片段来看,您在使用ADS1220进行数据转换时遇到了死机问题。这个问题可能有以下几个原因:

1. 硬件连接问题:请检查您的硬件连接是否正确,包括ADS1220与TMS320F28335之间的通信线路、电源和地线等。确保所有连接都牢固且无短路现象。

2. 时序问题:在您的代码中,您使用了延时函数来等待ADS1220复位和启动转换。请确保这些延时足够长,以满足ADS1220的时序要求。您可以尝试增加延时时间,或者使用更精确的时钟源来控制延时。

3. 程序代码问题:请检查您的程序代码是否正确实现了ADS1220的通信协议。确保您正确地发送了命令字节,并正确地读取了数据。您可以参考ADS1220的数据手册,以确保您的代码符合其通信协议。

4. 电源问题:请检查您的电源供应是否稳定,电压和电流是否符合ADS1220的要求。不稳定的电源可能导致ADS1220工作不正常,从而导致死机。

5. 软件中断问题:请检查您的程序中是否有软件中断,这些中断可能会影响ADS1220的数据转换。如果有可能,请关闭或减少软件中断的使用。

6. 硬件故障:如果以上方法都无法解决问题,您可能需要检查ADS1220和TMS320F28335是否有硬件故障。您可以尝试更换这些芯片,或者使用其他开发板进行测试。

总之,您需要从硬件连接、时序、程序代码、电源和软件中断等方面进行排查,以找到导致死机的原因。希望这些建议能帮助您解决问题。
1 举报

更多回帖

×
20
完善资料,
赚取积分