TI论坛
直播中

张艳

7年用户 1639经验值
私信 关注
[问答]

写了一个ADS1118的AD转换程序,不知道是不是SPI的写入函数出问题了,返回的值和理论值不同且无法给变量赋值,为什么?


  • 写了一个ADS1118的AD转换程序,不知道是不是SPI的写入函数出问题了,返回的值和理论值不同,且无法给变量赋值,程序如下:
    unsigned int Write_SIP(unsigned int temp)
    {
    unsigned char i;
    unsigned int Read_Data;
    Data_Out; //设置P3.0为输出 DIN -->对应(SOMI)
    Data_In; //设置P3.1为数据输入 Dout-->对应(SOMO);
    CLK_L;
    CS_L;
    for(i=0;i<16;i++) //只有在时钟上升沿时数据被锁存,为控制器通过下降沿读取数据
    {
    if((temp&0x8000)==0x8000) { DOUT_H;}
    else { DOUT_L;}
    temp<<=1;
    CLK_H;
    //delay_us(50);
    Read_Data<<=1;
    if(DIN){Read_Data++;}
    CLK_L;
    // delay_us(50);
    }
    DOUT_L;
    CS_H; //拉高Config Register读错误
    _NOP();
    return Read_Data;
    }
    void ADS1118_GPIO()
    {
    Data_Out; //MOSI
    Data_In; //MISO
    CLK_Out; //CLK
    CS_Out; //CS
    }
    void main(void)
    {
    WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
    ADS1118_GPIO();
    while(1)
    {
    CS_L;
    ConfigRegister = (Write_SIP(0xC18B)); //配置寄存器 Config Register
    Value = (Write_SIP(0xC18B)); //AD数值 Conversion Register
    CS_H;
    t = (Value*6.144)/32768;
    delay_ms(3600);
    _NOP(); //断点
    }
    }
    注:配置寄存器的写入值选择0XC18B是因为我选择的满量程是+-6.144V供电电压是5V,AINO输入的3.3V电压,最终函数的结果为:


    Value=0,ConfigRegister=0,Write_SIP(0xC18B)的返回值是0XC680,无法给Value,ConfigRegister赋值,不知道哪里错了,老师说我的SPI_Write()写的有问题,但是本人太菜了看不出来啊,希望大家帮我看看,谢谢大家!

回帖(1)

杨军

2024-12-9 11:47:02
从您提供的代码片段来看,存在一些潜在的问题可能导致返回值与理论值不同以及无法给变量赋值。以下是一些可能的原因和建议:

1. 代码片段不完整:您提供的代码片段不完整,缺少了一些关键部分,例如`Data_Out`、`Data_In`、`CLK_L`、`CS_L`、`DOUT_H`和`DOUT_L`的定义和实现。这可能导致代码无法正确编译和运行。

2. SPI通信时序问题:SPI通信需要遵循特定的时序,包括片选(CS)、时钟(CLK)和数据(DIN/DOUT)信号的控制。请确保您的代码正确地控制了这些信号,以满足ADS1118的SPI通信时序要求。

3. 数据位顺序问题:在SPI通信中,数据位的顺序(MSB或LSB)需要与设备的要求一致。请检查您的代码是否正确地处理了数据位的顺序。

4. 延迟问题:您在代码中注释掉了`delay_us(50)`,这可能导致时钟信号的上升沿和下降沿之间的时间间隔不符合ADS1118的要求。请确保在时钟信号的上升沿和下降沿之间添加适当的延迟。

5. 变量赋值问题:您提到无法给变量赋值。请检查您的代码中是否有正确的变量声明和赋值操作。例如,在`Write_SIP`函数中,您需要确保`Read_Data`变量在函数结束前被正确赋值。

为了解决这些问题,您可以尝试以下步骤:

1. 确保代码片段完整,包括所有必要的定义和实现。
2. 检查SPI通信时序,确保片选、时钟和数据信号的控制正确。
3. 检查数据位顺序,确保与ADS1118的要求一致。
4. 添加适当的延迟,以满足ADS1118的时钟信号要求。
5. 检查变量声明和赋值操作,确保变量在函数结束前被正确赋值。

希望这些建议能帮助您解决问题。如果您需要更详细的帮助,请提供完整的代码片段,以便我们能够更准确地诊断问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分