TI论坛
直播中

张波

8年用户 1507经验值
私信 关注
[问答]

用STM32 IO口模拟SPI驱动ADS1118,DOUT口输出很不稳定是怎么回事?


  • 程序如下,我直接用LCD12864显示转换的结果
    //main.c
    #include "sys.h"
    #include "usart.h"
    #include "ads1118.h"
    #include "lcd12864.h"
    #include "delay.h"
    int main(void)
    {        

        ADS1118_Init();
        LCD12864_Init();
        delay_init(72);
        while(1)
        {
            ADS1118_WriteBytes(0x85FB);
            while(DOUT_Set);
            LCD12864_Display_Integer(0,0,ADS1118_ReadBytes(),"7x8");
        }   
    }

    //ads1118.c
    #include "ADS1118.h"
    #include "STM32f10x.h"
    #include "delay.h"

    void ADS1118_Init(void)
    {
            GPIO_InitTypeDef GPIO_InitStructure;

            RCC_APB2PeriphClockCmd(ADS1118_CLOCK, ENABLE);

            GPIO_InitStructure.GPIO_Pin   = Pin_ADS1118_CS;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;            
            GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
            GPIO_Init(GPIO_ADS1118_CS, &GPIO_InitStructure);

            GPIO_InitStructure.GPIO_Pin   = Pin_ADS1118_SCLK;
            GPIO_Init(GPIO_ADS1118_SCLK, &GPIO_InitStructure);

            GPIO_InitStructure.GPIO_Pin   = Pin_ADS1118_DIN;
            GPIO_Init(GPIO_ADS1118_DIN, &GPIO_InitStructure);
       
       
            GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOAtiNG;
            GPIO_InitStructure.GPIO_Pin   = Pin_ADS1118_DOUT;
            GPIO_Init(GPIO_ADS1118_DOUT, &GPIO_InitStructure);
       
            ADS1118_CS_1();
            ADS1118_SCLK_1();
            ADS1118_DIN_1();

    }

    void ADS1118_WriteBytes( u16 data)
    {
        u8 i = 16;   
        ADS1118_CS_0();
        ADS1118_SCLK_1();   
        while(i--)
        {   
            delay_us(10);
            if(data&0x8000)
                ADS1118_DIN_1();
            else
                ADS1118_DIN_0();
            ADS1118_SCLK_0();
            data <<= 1;   
            delay_us(10);
            ADS1118_SCLK_1();   
        }

            ADS1118_SCLK_1();

       
    }
    u16 ADS1118_ReadBytes( void )
    {
        u8     i = 16;
        u16 data;
    //    if(DOUT_Set)
    //        return 0;
        ADS1118_SCLK_0();

       
        while(i--)
        {
            delay_us(10);
            ADS1118_SCLK_1();
            if(DOUT_Set)
                data |= 1;
            else data &= 0;
            data <<= 1;
            delay_us(10);
            ADS1118_SCLK_0();
            
        }
        return data;   
    }

    //ads1118.h
    #ifndef        _ADS1118_H
    #define        _ADS1118_H
    #include "stm32f10x.h"

    #define     GPIO_ADS1118_CS            GPIOA
    #define     GPIO_ADS1118_SCLK        GPIOA
    #define     GPIO_ADS1118_DIN        GPIOA
    #define     GPIO_ADS1118_DOUT        GPIOA



    #define        Pin_ADS1118_CS            GPIO_Pin_3
    #define        Pin_ADS1118_SCLK        GPIO_Pin_0
    #define        Pin_ADS1118_DIN            GPIO_Pin_1
    #define        Pin_ADS1118_DOUT        GPIO_Pin_2

    #define     ADS1118_CLOCK          (RCC_APB2Periph_GPIOA)

    #define        ADS1118_CS_1()            GPIO_SetBits(GPIO_ADS1118_CS,Pin_ADS1118_CS)
    #define        ADS1118_CS_0()            GPIO_ResetBits(GPIO_ADS1118_CS,Pin_ADS1118_CS)
    #define        ADS1118_SCLK_1()        GPIO_SetBits(GPIO_ADS1118_SCLK,Pin_ADS1118_SCLK)
    #define        ADS1118_SCLK_0()        GPIO_ResetBits(GPIO_ADS1118_SCLK,Pin_ADS1118_SCLK)
    #define        ADS1118_DIN_1()            GPIO_SetBits(GPIO_ADS1118_DIN,Pin_ADS1118_DIN)
    #define        ADS1118_DIN_0()            GPIO_ResetBits(GPIO_ADS1118_DIN,Pin_ADS1118_DIN)
    #define        ADS1118_DOUT_1()        GPIO_SetBits(GPIO_ADS1118_DOUT,Pin_ADS1118_DOUT)
    #define        ADS1118_DOUT_0()        GPIO_ResetBits(GPIO_ADS1118_DOUT,Pin_ADS1118_DOUT)

    #define   DOUT_Reset                    GPIO_ReadInputDataBit(GPIO_ADS1118_DOUT,Pin_ADS1118_DOUT)==RESET
    #define   DOUT_Set                        GPIO_ReadInputDataBit(GPIO_ADS1118_DOUT,Pin_ADS1118_DOUT)==SET

    #define        SingleSart                    1<<15

    #define        FS_6114                            0<<9
    #define        FS_4096                            1<<9
    #define        FS_2048                            2<<9
    #define        FS_1024                            3<<9
    #define        FS_0512                            4<<9
    #define        FS_0256                            5<<9

    #define        ConMode                            0<<8
    #define        SinMode                            1<<8

    #define        Rate_8SPS                        0<<5
    #define        Rate_16SPS                    1<<5
    #define        Rate_32SPS                    2<<5
    #define        Rate_64SPS                    3<<5
    #define        Rate_128SPS                    4<<5
    #define        Rate_250SPS                    5<<5
    #define        Rate_475SPS                    6<<5
    #define        Rate_860SPS                    7<<5

    #define        TemMode                            1<<4
    #define        ADCMode                            0<<4

    #define        EN_Pullup                        1<<3
    #define        Dis_Pullup                    0<<3

    #define        Write_Config                1<<1





    void ADS1118_WriteBytes( u16 data);
    void ADS1118_Init(void);
    u16 ADS1118_ReadBytes( void );

回帖(1)

京五环以外

2025-1-3 16:54:03
从您提供的代码片段来看,您正在使用STM32的IO口模拟SPI接口来驱动ADS1118,并使用LCD12864显示转换结果。如果DOUT口输出不稳定,可能有以下几个原因:

1. 时钟不稳定:确保您的STM32时钟配置正确,时钟不稳定可能导致SPI通信不稳定。

2. SPI通信速率:SPI通信速率过高可能导致数据传输不稳定。您可以尝试降低SPI通信速率,例如将SPI时钟速率设置为较低的值。

3. 硬件连接问题:检查您的硬件连接是否正确,包括ADS1118与STM32之间的连接,以及STM32与LCD12864之间的连接。确保所有连接都牢固且无短路。

4. 程序逻辑问题:检查您的程序逻辑是否正确,特别是ADS1118的初始化和SPI通信部分。确保您正确地发送了命令和读取了数据。

5. 电源问题:确保您的STM32和ADS1118电源稳定,电源不稳定可能导致输出不稳定。

6. 干扰问题:检查您的电路是否存在电磁干扰,电磁干扰可能导致SPI通信不稳定。

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

1. 检查硬件连接,确保所有连接都正确且无短路。

2. 降低SPI通信速率,尝试不同的速率以找到稳定的通信速率。

3. 检查电源稳定性,确保STM32和ADS1118的电源稳定。

4. 检查程序逻辑,确保ADS1118的初始化和SPI通信部分正确。

5. 如果可能,使用示波器检查SPI通信波形,以确定是否存在干扰或通信问题。

6. 如果问题仍然存在,您可以尝试使用STM32的硬件SPI接口,而不是模拟SPI接口,以提高通信稳定性。

希望这些建议能帮助您解决问题。如果您需要进一步的帮助,请提供更多的代码和硬件信息。
举报

更多回帖

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