This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教下,用STM32IO口模拟SPI驱动ADS1118,发现它的DOUT口输出很不稳定(内部温度传感器),而且连续模式要不停的写SS位

Other Parts Discussed in Thread: ADS1118

程序如下,我直接用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 );




#endif

x 出现错误。请重试或与管理员联系。