TI论坛
直播中

张鹏

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

使用STM32单片机硬件,ADS1120芯片程序出现通道之间数据相串是怎么回事?


  • 使用STM32单片机硬件(SPI),ADS1120芯片程序是出现通道之间数据相串(将信号输入IN0,其余的两个通道(IN1、IN2)出现ADC值一样);电路图如下:





    #include "ADS1120.h"


    unsigned char channel0[8],channel1[8],Init_Config[4];



    void SPI3_Init(void)
    {
            GPIO_InitTypeDef GPIO_InitStructure;
      SPI_InitTypeDef  SPI_InitStructure;
            
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//PORTB时钟使能
            RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI3,  ENABLE );//SPI3时钟使能         
            
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_2;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB3/4/5复用推挽输出
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
                   
            GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //PB3/4/5上拉
            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//

            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_High;                //串行同步时钟的空闲状态为高电平
            SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
            SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//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(SPI3, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

            SPI_Cmd(SPI3, ENABLE); //使能SPI外设

            SPI3_ReadWriteByte(0xFF);//启动传输                 

    }   
    /***************************************************************************
    * Function Name:  SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)
    * Purpose:                           SPI velocity
    * Params :        1.SPI_BaudRatePrescaler:速率
    *
    *************************************************************************/  
    //SPI 速度设置函数
    //SpeedSet:
    //SPI_BaudRatePrescaler_2   2分频   
    //SPI_BaudRatePrescaler_8   8分频   
    //SPI_BaudRatePrescaler_16  16分频  
    //SPI_BaudRatePrescaler_256 256分频
    void SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)
    {
      assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
            SPI3->CR1&=0XFFC7;
            SPI3->CR1|=SPI_BaudRatePrescaler;        //设置SPI3速度
            SPI_Cmd(SPI3,ENABLE);

    }
    //SPIx 读写一个字节
    //TxData:要写入的字节
    //返回值:读取到的字节
    u8 SPI3_ReadWriteByte(u8 TxData)
    {                        
            u8 retry=0;               
            ADS11XX_CS = 0;        
            while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
                    {
                    retry++;
                    if(retry>200)return 0;
                    }                          
            SPI_I2S_SendData(SPI3, TxData); //通过外设SPIx发送一个数据
            retry=0;

            while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
                    {
                    retry++;
                    if(retry>200)return 0;
                    }         
            ADS11XX_CS = 1;
            return SPI_I2S_ReceiveData(SPI3); //返回通过SPIx最近接收的数据                                            
    }
    /****************************************************************
      * @brief  ADS1120_WriteRead.
      * @param  None
      * @retval None
      */
    void ADS1120_WriteRead(uint8_t Byte, uint8_t *RxBuffer,uint16_t RxLenth)
    {
            int i;
            SPI3_ReadWriteByte(Byte);
            for(i=0; i

回帖(2)

潘晶燕

2024-12-12 09:55:48
是不是其他两个通道悬空了, 当采样保持的时候, 得不到外面的信号,所以采样电容上的电压不能变化
举报

张亮

2024-12-12 17:13:14
根据您提供的信息,您在使用STM32单片机和ADS1120芯片时遇到了通道之间数据相串的问题。为了解决这个问题,我们可以按照以下步骤进行排查和解决:

1. 检查硬件连接:首先,确保您的硬件连接正确。检查ADS1120芯片的引脚是否正确连接到STM32单片机的SPI接口,以及通道选择引脚是否正确连接。

2. 检查SPI初始化:确保您的SPI初始化代码正确。根据您的代码片段,您已经初始化了GPIO和SPI。请检查RCC_APB2PeriphClockCmd、GPIO_InitStructure和SPI_InitStructure的配置是否正确。

3. 检查ADS1120配置:确保您正确配置了ADS1120芯片。根据您的代码片段,您已经定义了Init_Config数组。请检查该数组中的配置值是否正确,以及是否正确地将配置值写入ADS1120芯片。

4. 检查通道选择:确保您正确选择了通道。根据您的代码片段,您已经定义了channel0、channel1和channel2数组。请检查您是否正确地将通道选择信号发送给ADS1120芯片,以及是否正确地读取了通道数据。

5. 检查代码逻辑:检查您的代码逻辑是否正确。确保您在读取通道数据时,正确地选择了通道,并且正确地处理了通道数据。

6. 检查干扰:检查您的电路是否存在干扰。干扰可能导致通道之间数据相串。您可以尝试使用屏蔽线、远离噪声源或增加滤波器等方法来减少干扰。

7. 检查ADS1120芯片:如果以上步骤都无法解决问题,可能是ADS1120芯片本身存在问题。您可以尝试更换一个芯片,看是否能够解决问题。

通过以上步骤,您应该能够找到导致通道之间数据相串的原因,并采取相应的措施解决问题。
举报

更多回帖

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