TI论坛
直播中

李平

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

ADS1247读取寄存器的值总是不太正确,为什么?


  • 这是spi初始化:
    void InitSpi2(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);//使能GPIOB时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟
    //GPIOFB3,4,5初始化设置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;//40MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PA4复用功能输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;//40MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
    O_ADS1247_CS = 1;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//DRDY Pin
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    O_ADS1247_Power = 1;
    O_ADS1247_Rst = 1;
    O_ADS1247_Start = 0;

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
    SPI_I2S_DeInit(SPI2);
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
    SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
    SPI_Cmd(SPI2, ENABLE); //使能SPI外设
    // SPI2_WriteBytes(0xff,1);
    }


    这是读写寄存器的程序:
    void ADS1247_RWSYSReg()
    {
    uint8_t Data[10]={0};
    unsigned char i=0;

    O_ADS1247_CS = 0;//ADS1247_CLR_CS;
    O_ADS1247_Start = 1;//ADS1247_SET_START;
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2, 0x42); // 写 SYS0 寄存器
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2, 0x00); // 写 1 个寄存器
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2, 0x21); // 向 SYS0 寄存器写入 0x05, (PGA=1,160SPS)
    // while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    // SPI_I2S_SendData(SPI2,0xFF);
    for(i = 0; i < 10; i++) // 连续读寄存器10次
    {
    Delay_us(100);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2,0x22);
    Delay_us(100);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2,0x00);
    Delay_us(100);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2,0xFF);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    Data = SPI_I2S_ReceiveData(SPI2);
    }
    __breakpoint(0);
    O_ADS1247_CS = 1;//ADS1247_SET_CS;
    }

    主芯片用的是STM32l151. 试过MUX1 和 SYS0 都是一样的情况.

回帖(2)

张雯雯

昨天 11:29
mcu,busy标志位未判断的问题.
举报

lique

昨天 18:11
从您提供的代码片段来看,您正在初始化SPI2接口。关于ADS1247读取寄存器值不正确的问题,可能有以下几个原因:

1. SPI初始化配置错误:请确保您的SPI初始化配置正确,包括时钟极性和相位、数据位宽度、波特率等。这些参数需要与ADS1247的配置相匹配。

2. CS(片选)信号问题:请检查您的CS信号是否正确配置和控制。在SPI通信过程中,CS信号需要在发送数据前拉低,数据发送完毕后拉高。

3. 时序问题:请检查您的SPI通信时序是否正确。ADS1247对时序有一定的要求,如果时序不正确,可能会导致读取寄存器值错误。

4. 硬件连接问题:请检查您的硬件连接是否正确,包括SPI接口的MISO、MOSI、SCK和CS引脚是否正确连接。

5. ADS1247配置问题:请检查您的ADS1247配置是否正确,包括寄存器设置、采样率、增益等参数。

以下是一些建议,希望对您有所帮助:

1. 检查SPI初始化配置,确保与ADS1247的配置相匹配。

```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // 使能SPI2时钟
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 双线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; // 数据位宽度为16位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // 时钟极性为低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // 时钟相位为第一个边沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // NSS软件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; // 波特率预分频
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 数据传输从MSB开始
SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC多项式
SPI_Init(SPI2, &SPI_InitStructure); // 初始化SPI2
```

2. 检查CS信号控制代码,确保在发送数据前拉低,数据发送完毕后拉高。

```c
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // 拉低CS信号
// 发送数据和接收数据
GPIO_SetBits(GPIOB, GPIO_Pin_12); // 拉高CS信号
```

3. 检查硬件连接,确保SPI接口的MISO、MOSI、SCK和CS引脚正确连接。

4. 检查ADS1247配置,确保寄存器设置、采样率、增益等参数正确。

希望以上建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便进一步分析。
举报

更多回帖

×
20
完善资料,
赚取积分