TI论坛
直播中

吴藩

10年用户 912经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32F103与ADS8331 SPI读写不通是哪里出了问题?


  • #include "STM32f10x.h"
    #include "delay.h"
    #include "spi.h"
    #include "ads8331_function.h"
    /*******************************************************************************
    ******************************************************************************/
    void ADS8331_SPI_Config(void)
    {
    SPI_InitTypeDef SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    //*****************************************************************************************
    //³õʼ»¯ADS8331¿ØÖÆÒý½Å ¿ØÖÆIO ·ÇSPIͨѶ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHz
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //ÉÏÀ­ÊäÈë
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯GPIOB.0 ΪÉÏÀ­ÊäÈëÒý½Å END-DRDY
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯PB.1 ÍÆÍìÊä³öÒý½Å START

    //*****************************************************************************************
    //SPI ͨѶÅäÖÃ
    /* Enable SPI clocks */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    /* Configure SPI pins: SCK, MISO and MOSI */
    GPIO_InitStructure.GPIO_Pin = ADS8331_SCK | ADS8331_DO | ADS8331_DIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(ADS8331_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = ADS8331_CS;
    GPIO_Init(ADS8331_PORT, &GPIO_InitStructure);
    ADS8331_CS_H();
    /* SPI configuration */
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    // SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //SPI Ö¡½á¹¹16b
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    // SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    // SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //Ô­À´
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //PCLK1/32=24/16=1.5MHz,
    // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(ADS8331_SPI, &SPI_InitStructure);//ÉèÖÃSPI ÍâÉè #define ADS1248_SPI SPI1
    /* Enable SPI */
    SPI_Cmd(ADS8331_SPI, ENABLE); //ʹÄÜSPI #define ADS1248_SPI SPI1
    }
    /*******************************************************************************
    *******************************************************************************/
    u16 ADS8331_ReadWord(void)
    {
    return (ADS8331_WriteWord(ADS_NOP));
    }

    *******************************************************************************/
    u16 ADS8331_WriteWord(u16 data)
    {
    /* Loop while DR register in not emplty */
    while(SPI_I2S_GetFlagStatus(ADS8331_SPI, SPI_I2S_FLAG_TXE) == RESET);
    /* Send u8 through the SPI bus peripheral */
    SPI_I2S_SendData(ADS8331_SPI, data);
    /* Wait to receive a u8 */
    while(SPI_I2S_GetFlagStatus(ADS8331_SPI, SPI_I2S_FLAG_RXNE) == RESET);
    /* Return the u8 read from the SPI bus */
    return SPI_I2S_ReceiveData(ADS8331_SPI);
    }

    void ADS_Wtite_Reg(u16 reg)
    {
    reg = Write_CFR_CMD | reg;
    ADS8331_CS_L();
    ADS8331_WriteWord(reg);
    ADS8331_CS_H();
    }
    //*****************************
    //¶ÁÅäÖüĴæÆ÷

    u16 ADS_Read_Reg(void)
    { u16 reg;
    ADS8331_CS_L();
    ADS8331_WriteWord(Read_CFR_CMD);
    reg = ADS8331_ReadWord();
    ADS8331_CS_H();
    return (reg&0x0fff);
    }
    //ÅäÖÃADS8331
    u16 ADS8331_CONFIG(void)
    { u16 config_REG ;
    config_REG = Nomal_Operation
                            | Deep_Power_Down_DIS
                            | Nap_Power_Down_DIS
                            | Auto_Nap_Power_Down_DIS
                            | Pin10_As_EOC_INT
                            | Pin10_as_EOC
                            | EOC_INT_Active_Low
                            | SPS_250k_42CCLKs
                            | Manual_Trigger
                            | Conversion_Clock_Full_SCLK
                              // | Auto_Channel_Select_EN
                            ;
    ADS_Wtite_Reg(config_REG) ; //дÅäÖüĴæÆ÷

    delay_us(200);
    return ADS_Read_Reg(); //·µ»Ø¶ÁÈ¡µÄ ÅäÖüĴæÆ÷½øÐжԱÈ
    }
    调用 u16 ADS8331_CONFIG(void)  函数,采样位置和时钟极性也调整过,什么也读不到。。。不知道错哪里了,求指点,不胜感激。
    #ifndef __ADS8331_FUNCTION_H
    #define __ADS8331_FUNCTION_H
    #include "sys.h"

    #define Vref 2.048f

    //#define ADS_NOP 0x8000
    #define ADS_NOP 0x9000
    //#define ADS_NOP 0xa000
    //ADͨ·ѡÔñ**************
    #define ADIN1 0x0000
    #define ADIN2 0x1000
    #define ADIN3 0x3000
    #define ADIN4 0x4000
    //*************************************
    //AD¿ØÖÆÃüÁî***************************
    #define WakeUp_CMD 0xb000
    #define Defaule_CMD 0xf000
    //*************************************
    //ADÒý½Å¿ØÖÆ***************************
    #define ADS8331_EOC GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
    #define ADS8331_EOC_high GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1 //
    #define ADS8331_EOC_low GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0 //Data ready (active low)
    #define ADS8331_CONVST_H GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_SET) //ÉèÖÃCONVST_H 1 ²»¿ªÊ¼×ª»» (1£ºBit_SET;0:Bit_RESET)
    #define ADS8331_CONVST_L GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET); //ÉèÖÃCONVST_H 0 ¿ªÊ¼×ª»» (1£ºBit_SET;0:Bit_RESET)
    //****************************************
    #define Read_CFR_CMD 0xc000
    #define Read_data_CMD 0xd000
    #define Write_CFR_CMD 0xe000
    //****************************************
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    #define Nomal_Operation 0x0001 //SoftWare_Rest
    #define TAG_Bit_Out_En 0x0002 //TAG_Bit_Out_DIS
    #define Deep_Power_Down_DIS 0x0004 //Deap_Power_Down_EN
    #define Nap_Power_Down_DIS 0x0008 //Nap_Power_Down_EN
    #define Auto_Nap_Power_Down_DIS 0x0010 //Auto_Nap_Power_Down_EN
    #define Pin10_As_EOC_INT 0x0020 //Pin10_as_CDI
    #define Pin10_as_EOC 0x0040 //Pin10_as_INT
    #define EOC_INT_Active_Low 0x0080 //EOC_INT_Active_Hign
    #define SPS_250k_42CCLKs 0x0100 //SPS_500k_21CCLKs
    #define Manual_Trigger 0x0200 //Auto_Trigger
    #define Conversion_Clock_Full_SCLK 0x0400 //Conversion_Clock_Half_SCLK
    #define Auto_Channel_Select_EN 0x0800 //Manual_Channel_Select_EN
    /* | Nomal_Operation //D0
    | TAG_Bit_Out_En //D1
    | Deep_Power_Down_DIS //D2
    | Nap_Power_Down_DIS //D3
    | Auto_Nap_Power_Down_DIS //D4
    | Pin10_As_EOC_INT //D5
    | Pin10_as_EOC //D6
    | EOC_INT_Active_Low //D7
    | SPS_250k_42CCLKs //D8
    | Manual_Trigger //D9
    | Conversion_Clock_Full_SCLK //D10
    | Manual_Channel_Select_EN //D11
    */

    void ADS_Wtite_Reg(u16 reg);//д¼Ä´æÆ÷
    u16 ADS_Read_Reg(void);//¶Á¼Ä´æÆ÷
    u16 ADS8331_CONFIG(void) ;
    void ADS_Channel_Select(u16 channal) ;//ADͨµÀÑ¡Ôñ//ÊäÈë ADIN1£»ADIN2£»ADIN3£»ADIN4
    void ADS_Start(void);//¿ªÊ¼×ª»»
    u16 ADS_Read_Data(void);//¶ÁÈ¡ADCת»»ÊýÖµ
    float Get_voltage(u16 channal);
    void ADS_Default(void) ;
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    #endif

回帖(3)

邢东

2024-12-24 16:58:07
我觉得你先示波器捉波形看看 再看看寄存器配置有没有问题
举报

马祥

2024-12-24 17:00:17

AINp-AINn>0不是采集的必须条件。


当VIN

= VAINP – VAINN<-FS== –VREF / Gain时候输出8000h,如果VIN = VAINP –

VAINN=-FS/2^15时候输出即为65535.

所以还是要确认输入是多少


举报

你又知道了

2024-12-24 17:46:28
首先,我们需要检查以下几个方面来确定STM32F103与ADS8331 SPI读写不通的问题所在:

1. 硬件连接:
确保STM32F103与ADS8331之间的SPI接口连接正确。检查以下引脚是否正确连接:
- MOSI(Master Out Slave In):STM32的SPI_MOSI引脚连接到ADS8331的DIN引脚
- MISO(Master In Slave Out):STM32的SPI_MISO引脚连接到ADS8331的DOUT引脚
- SCK(Serial Clock):STM32的SPI_SCK引脚连接到ADS8331的CLK引脚
- CS(Chip Select):STM32的SPI_CS引脚连接到ADS8331的CS引脚
- GND(Ground):确保STM32和ADS8331的地线连接在一起
- VDD(电源):确保STM32和ADS8331的电源连接在一起

2. 时钟配置:
确保STM32F103的SPI时钟配置正确。在代码中,我们需要配置SPI的时钟速度、CPOL(时钟极性)和CPHA(时钟相位)。以下是SPI初始化的示例代码:

```c
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 使能SPI1时钟

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 根据需要调整时钟速度
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

SPI_Cmd(SPI1, ENABLE); // 使能SPI1
```

3. GPIO配置:
确保STM32F103的GPIO配置正确。以下是GPIO初始化的示例代码:

```c
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // PA5:SCK, PA6:MISO, PA7:MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // PA4:CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
```

4. ADS8331初始化:
确保ADS8331的初始化代码正确。以下是ADS8331初始化的示例代码:

```c
void ADS8331_Init(void) {
    ADS8331_CS_High();
    ADS8331_SendByte(0x90); // 设置控制寄存器
    ADS8331_CS_Low();
    ADS8331_SendByte(0x00); // 读取控制寄存器
    ADS8331_CS_High();
}
```

5. 调试:
使用调试工具(如ST-Link)逐步检查代码执行过程,确保SPI读写操作正确执行。检查SPI发送和接收的数据是否正确。

通过以上步骤,我们可以逐步排查STM32F103与ADS8331 SPI读写不通的问题。如果问题仍然存在,请检查硬件连接是否正确,或者尝试更换ADS8331芯片。
举报

更多回帖

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