完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
关于ADS1118模数转换器的问题 CPOL设置为低电平CPHA设置为下降沿,然后每次都是给ADS1118发送 同样的设置 /** ****************************************************************************** * @file ADS1118.c * @author HEU-ICEC-SAST SunZhengYuan * @version V1.0 * @date 20-7-2014 * @brief Analog to Digital Converter Driver ****************************************************************************** * @attention The source of this program come from the Internet. *and intergrated by Sunzhengyuan. ****************************************************************************** */ #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_spi.h" #include "ADS1118.h" //----------------------Data Buffer-------------------------------------- /**THESE PARAM TO STORE THE DATA THAT WILL TRANSMIT VIA SPI,AND RECERIVE *THE DATA FROM SPI ***/ volatile uint8_t readata1; volatile uint8_t readata2; volatile uint8_t readata3; volatile uint8_t readata4; volatile uint32_t readata; /********************************************************************** **********************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE); /* //LDO power2 control pin GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //B?? //POWER OFF CONTROL PIN GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //KEYPOWER PA15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); */ //ADS1118 //AD_SPI1_CS PA4 //AD_SPI1_SCK PA5 //AD_SPI1_MISO PA6 //AD_SPI1_MOSI PA7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } uint16_t ADS_configuration(void) { uint16_t ADS_Con; ADS_InitTypeDef ADS_InitStructure; ADS_InitStructure.stru.OS = SINGLE_CONVER; ADS_InitStructure.stru.MUX = AINPN_0_1; ADS_InitStructure.stru.PGA = PGA_2048; ADS_InitStructure.stru.MODE = CONTIOUS; ADS_InitStructure.stru.DR = DR_128_SPS; ADS_InitStructure.stru.TS_MODE = TEMPERATURE_MODE; //TEMPERATURE MODE ADS_InitStructure.stru.PULLUP = PULL_UP_DIS; ADS_InitStructure.stru.NOP = DATA_VALID; ADS_InitStructure.stru.CNV_RDY_FL = DATA_NREADY; ADS_Con=ADS_InitStructure.word; return (ADS_Con); } /********************************************************************** **********************************************************************/ void SPI_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //AD_SPI1_CS PA4 //AD_SPI1_SCK PA5 //AD_SPI1_MISO PA6 //AD_SPI1_MOSI PA7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7; // 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_6; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //??? SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //??? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8? SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //???? ?????,SCK????? SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //???? ?????????????? SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //????NSS SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //????? SYSCLK/16 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //?????? SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC??????????7 SPI_Init(SPI1, &SPI_InitStructure); /* ??SPI1 */ SPI_Cmd(SPI1, ENABLE); } /********************************************************************** **********************************************************************/ void delay( uint32_t nCount ) { for(; nCount != 0; nCount--) { ; } } /********************************************************************** **********************************************************************/ uint8_t SPI1_SendByte(uint8_t byte) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) { ; } SPI_I2S_SendData(SPI1, byte); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) { ; } return SPI_I2S_ReceiveData(SPI1); } /********************************************************************** **********************************************************************/ uint32_t SPI_RW_Reg(uint16_t CofigReg) { // delay(10); delay(10); readata1=SPI1_SendByte((uint8_t)(CofigReg>>8)); readata2=SPI1_SendByte((uint8_t)CofigReg); readata3=SPI1_SendByte((uint8_t)(CofigReg>>8)); readata4=SPI1_SendByte((uint8_t)CofigReg); readata= (uint32_t)readata4|((uint32_t)readata3<<8)|((uint32_t)readata2<<16)|((uint32_t)readata1<<24); // delay(1000); delay(1000); //ads_cs_1(); return readata; } #ifndef ADS1118_H #define ADS1118_H #include "stdint.h" // ------ Public constants ----------------------------------------- //------------------------------------------------------------------ // Should Not Need To Edit The Section Blow //------------------------------------------------------------------ // ------ Define and Typedefine------------------------------------- //#define AD_SPI1_CS PA4 //#define AD_SPI1_SCK PA5 //#define AD_SPI1_MISO PA6 //#define AD_SPI1_MOSI PA7 //( Config Register ) //Operational status/single-shot conversion start #define CONFIG_BIT_OS (1<<15) //MUX[2:0]: Input multiplexer configuration #define CONFIG_BIT_MUX (7<<12) //PGA[2:0]: Programmable gain amplifier configuration #define CONFIG_BIT_PGA (7<<9) //MODE: Device operating mode #define CONFIG_BIT_MODE (1<<8) //DR[2:0]: Data rate #define CONFIG_BIT_DR (7<<5) //TS_MODE: Temperature sensor mode #define CONFIG_BIT_TS_MODE (1<<4) //PULL_UP_EN: Pull-up enable #define CONFIG_BIT_PULLUP_EN (1<<3) //NOP: No operation #define CONFIG_BIT_NOP (3<<1) //CNV_RDY_FL: Conversion ready flag #define CONFIG_BIT_CNV_RDY_FL (1<<0) // ------ Public data type declarations ---------------------------- typedef union { //uint8_t Data_MSB :8; //uint8_t Data_LSB :8; struct { volatile uint8_t CNV_RDY_FL :1; //low volatile uint8_t NOP :2; volatile uint8_t PULLUP :1; volatile uint8_t TS_MODE :1; volatile uint8_t DR :3; volatile uint8_t MODE :1; volatile uint8_t PGA :3; volatile uint8_t MUX :3; volatile uint8_t OS :1; //high } stru; volatile uint16_t word; } ADS_InitTypeDef; typedef enum { CONVERING = 0x0, SINGLE_CONVER = 0x1 } ADS_OS_TypeDef; typedef enum { AINPN_0_1 = 0x0, AINPN_0_3 = 0x1, AINPN_1_3 = 0x2, AINPN_2_3 = 0x3, AINPN_0_GND= 0x4, AINPN_1_GND= 0x5, AINPN_2_GND= 0x6, AINPN_3_GND= 0x7 } ADS_MUX_TypeDef; typedef enum { PGA_6144 = 0x0, PGA_4096 = 0x1, PGA_2048 = 0x2, PGA_1024 = 0x3, PGA_512 = 0x4, PGA_256 = 0x5 } ADS_PGA_TypeDef; typedef enum { CONTIOUS = 0x0, SINGLE_SHOT = 0x1 } ADS_MODE_TypeDef; typedef enum { DR_8_SPS = 0x0, DR_16_SPS = 0x1, DR_32_SPS = 0x2, DR_64_SPS = 0x3, DR_128_SPS = 0x4, DR_250_SPS = 0x5, DR_475_SPS = 0x6, DR_860_SPS = 0x7 } ADS_DATARATE_TypeDef; typedef enum { ADC_MODE = 0x0, TEMPERATURE_MODE = 0x1 } ADS_TSMODE_TypeDef; typedef enum { PULL_UP_DIS = 0x0, PULL_UP_EN = 0x1 } ADS_PULL_TypeDef; typedef enum { DATA_VALID = 0x1, DATA_INVALID = 0x0 } ADS_NOP_TypeDef; typedef enum { DATA_READY = 0x0, DATA_NREADY = 0x1 } ADS_RDY_TypeDef; /******************************************************************* **** DO AS THE DIRECTION **** *******************************************************************/ // There is no need to use this part when CS is tied to the Pin of GND. /* // ------ Public function prototypes ------------------------------- #define ads_cs_0() GPIO_ResetBits(GPIOA, GPIO_Pin_4) #define ads_cs_1() GPIO_SetBits(GPIOA, GPIO_Pin_4) */ void delay( uint32_t nCount ); /** *IF you want to configuration ADS1118,you should add these two *configuration function to your Process first . **/ void GPIO_Configuration(void); void SPI_Configuration(void); /** *You can config the ADS in the ADS_InitInstrcutre,when you use *a parameter to rever a reval of this function; * EXA: ADS_Con=ADS_configuration(); *Then,when you want to get a converted value ,just use a new *parameter to do like this * EXA: Converted_value=SPI_RW_Reg(ADS_Con); *then the value is in this parameter "Converted_value" **/ uint16_t ADS_configuration(void); uint32_t SPI_RW_Reg(uint16_t CofigReg); /** *Private function **/ uint8_t SPI1_SendByte(uint8_t byte); #endif /******************************************************************* **** END OF FILE **** *******************************************************************/ 程序本来是从网上找的,我后来改的,唯一的优点是接上电路能检测单存在DRDY低电平,但是示数却总是卡住,每次按复位数字又变化,但是好像是随机数,拜托,希望高手给看看是不是程序的问题 Other Parts Discussed in Thread: ADS1118, ADS1118EVM我采用的是将cs引脚直接与GND相连,然后怎么能进行温度转化呢,用的是stm32的spi模块 CPOL设置为低电平CPHA设置为下降沿,然后每次都是给ADS1118发送 同样的设置 /** ****************************************************************************** * @file ADS1118.c * @author HEU-ICEC-SAST SunZhengYuan * @version V1.0 * @date 20-7-2014 * @brief Analog to Digital Converter Driver ****************************************************************************** * @attention The source of this program come from the Internet. *and intergrated by Sunzhengyuan. ****************************************************************************** */ #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_spi.h" #include "ADS1118.h" //----------------------Data Buffer-------------------------------------- /**THESE PARAM TO STORE THE DATA THAT WILL TRANSMIT VIA SPI,AND RECERIVE *THE DATA FROM SPI ***/ volatile uint8_t readata1; volatile uint8_t readata2; volatile uint8_t readata3; volatile uint8_t readata4; volatile uint32_t readata; /********************************************************************** **********************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE); /* //LDO power2 control pin GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //B?? //POWER OFF CONTROL PIN GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //KEYPOWER PA15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); */ //ADS1118 //AD_SPI1_CS PA4 //AD_SPI1_SCK PA5 //AD_SPI1_MISO PA6 //AD_SPI1_MOSI PA7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } uint16_t ADS_configuration(void) { uint16_t ADS_Con; ADS_InitTypeDef ADS_InitStructure; ADS_InitStructure.stru.OS = SINGLE_CONVER; ADS_InitStructure.stru.MUX = AINPN_0_1; ADS_InitStructure.stru.PGA = PGA_2048; ADS_InitStructure.stru.MODE = CONTIOUS; ADS_InitStructure.stru.DR = DR_128_SPS; ADS_InitStructure.stru.TS_MODE = TEMPERATURE_MODE; //TEMPERATURE MODE ADS_InitStructure.stru.PULLUP = PULL_UP_DIS; ADS_InitStructure.stru.NOP = DATA_VALID; ADS_InitStructure.stru.CNV_RDY_FL = DATA_NREADY; ADS_Con=ADS_InitStructure.word; return (ADS_Con); } /********************************************************************** **********************************************************************/ void SPI_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //AD_SPI1_CS PA4 //AD_SPI1_SCK PA5 //AD_SPI1_MISO PA6 //AD_SPI1_MOSI PA7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7; // 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_6; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //??? SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //??? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8? SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //???? ?????,SCK????? SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //???? ?????????????? SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //????NSS SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //????? SYSCLK/16 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //?????? SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC??????????7 SPI_Init(SPI1, &SPI_InitStructure); /* ??SPI1 */ SPI_Cmd(SPI1, ENABLE); } /********************************************************************** **********************************************************************/ void delay( uint32_t nCount ) { for(; nCount != 0; nCount--) { ; } } /********************************************************************** **********************************************************************/ uint8_t SPI1_SendByte(uint8_t byte) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) { ; } SPI_I2S_SendData(SPI1, byte); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) { ; } return SPI_I2S_ReceiveData(SPI1); } /********************************************************************** **********************************************************************/ uint32_t SPI_RW_Reg(uint16_t CofigReg) { // delay(10); delay(10); readata1=SPI1_SendByte((uint8_t)(CofigReg>>8)); readata2=SPI1_SendByte((uint8_t)CofigReg); readata3=SPI1_SendByte((uint8_t)(CofigReg>>8)); readata4=SPI1_SendByte((uint8_t)CofigReg); readata= (uint32_t)readata4|((uint32_t)readata3<<8)|((uint32_t)readata2<<16)|((uint32_t)readata1<<24); // delay(1000); delay(1000); //ads_cs_1(); return readata; } #ifndef ADS1118_H #define ADS1118_H #include "stdint.h" // ------ Public constants ----------------------------------------- //------------------------------------------------------------------ // Should Not Need To Edit The Section Blow //------------------------------------------------------------------ // ------ Define and Typedefine------------------------------------- //#define AD_SPI1_CS PA4 //#define AD_SPI1_SCK PA5 //#define AD_SPI1_MISO PA6 //#define AD_SPI1_MOSI PA7 //( Config Register ) //Operational status/single-shot conversion start #define CONFIG_BIT_OS (1<<15) //MUX[2:0]: Input multiplexer configuration #define CONFIG_BIT_MUX (7<<12) //PGA[2:0]: Programmable gain amplifier configuration #define CONFIG_BIT_PGA (7<<9) //MODE: Device operating mode #define CONFIG_BIT_MODE (1<<8) //DR[2:0]: Data rate #define CONFIG_BIT_DR (7<<5) //TS_MODE: Temperature sensor mode #define CONFIG_BIT_TS_MODE (1<<4) //PULL_UP_EN: Pull-up enable #define CONFIG_BIT_PULLUP_EN (1<<3) //NOP: No operation #define CONFIG_BIT_NOP (3<<1) //CNV_RDY_FL: Conversion ready flag #define CONFIG_BIT_CNV_RDY_FL (1<<0) // ------ Public data type declarations ---------------------------- typedef union { //uint8_t Data_MSB :8; //uint8_t Data_LSB :8; struct { volatile uint8_t CNV_RDY_FL :1; //low volatile uint8_t NOP :2; volatile uint8_t PULLUP :1; volatile uint8_t TS_MODE :1; volatile uint8_t DR :3; volatile uint8_t MODE :1; volatile uint8_t PGA :3; volatile uint8_t MUX :3; volatile uint8_t OS :1; //high } stru; volatile uint16_t word; } ADS_InitTypeDef; typedef enum { CONVERING = 0x0, SINGLE_CONVER = 0x1 } ADS_OS_TypeDef; typedef enum { AINPN_0_1 = 0x0, AINPN_0_3 = 0x1, AINPN_1_3 = 0x2, AINPN_2_3 = 0x3, AINPN_0_GND= 0x4, AINPN_1_GND= 0x5, AINPN_2_GND= 0x6, AINPN_3_GND= 0x7 } ADS_MUX_TypeDef; typedef enum { PGA_6144 = 0x0, PGA_4096 = 0x1, PGA_2048 = 0x2, PGA_1024 = 0x3, PGA_512 = 0x4, PGA_256 = 0x5 } ADS_PGA_TypeDef; typedef enum { CONTIOUS = 0x0, SINGLE_SHOT = 0x1 } ADS_MODE_TypeDef; typedef enum { DR_8_SPS = 0x0, DR_16_SPS = 0x1, DR_32_SPS = 0x2, DR_64_SPS = 0x3, DR_128_SPS = 0x4, DR_250_SPS = 0x5, DR_475_SPS = 0x6, DR_860_SPS = 0x7 } ADS_DATARATE_TypeDef; typedef enum { ADC_MODE = 0x0, TEMPERATURE_MODE = 0x1 } ADS_TSMODE_TypeDef; typedef enum { PULL_UP_DIS = 0x0, PULL_UP_EN = 0x1 } ADS_PULL_TypeDef; typedef enum { DATA_VALID = 0x1, DATA_INVALID = 0x0 } ADS_NOP_TypeDef; typedef enum { DATA_READY = 0x0, DATA_NREADY = 0x1 } ADS_RDY_TypeDef; /******************************************************************* **** DO AS THE DIRECTION **** *******************************************************************/ // There is no need to use this part when CS is tied to the Pin of GND. /* // ------ Public function prototypes ------------------------------- #define ads_cs_0() GPIO_ResetBits(GPIOA, GPIO_Pin_4) #define ads_cs_1() GPIO_SetBits(GPIOA, GPIO_Pin_4) */ void delay( uint32_t nCount ); /** *IF you want to configuration ADS1118,you should add these two *configuration function to your Process first . **/ void GPIO_Configuration(void); void SPI_Configuration(void); /** *You can config the ADS in the ADS_InitInstrcutre,when you use *a parameter to rever a reval of this function; * EXA: ADS_Con=ADS_configuration(); *Then,when you want to get a converted value ,just use a new *parameter to do like this * EXA: Converted_value=SPI_RW_Reg(ADS_Con); *then the value is in this parameter "Converted_value" **/ uint16_t ADS_configuration(void); uint32_t SPI_RW_Reg(uint16_t CofigReg); /** *Private function **/ uint8_t SPI1_SendByte(uint8_t byte); #endif /******************************************************************* **** END OF FILE **** *******************************************************************/ 程序本来是从网上找的,我后来改的,唯一的优点是接上电路能检测单存在DRDY低电平,但是示数却总是卡住,每次按复位数字又变化,但是好像是随机数,拜托,希望高手给看看是不是程序的问题 请问有没有参考程序,我想看看究竟是我电路板的问题还是程序的问题,因为一直采不到波形 |
|
相关推荐
3个回答
|
|
|
|
|
|
|
|
|
|
|
|
|
关于ADS1118模数转换器的问题,您提到了将CS引脚直接与GND相连,并且使用STM32的SPI模块进行通信。以下是一些建议和步骤,帮助您解决关于ADS1118模数转换器的问题:
1. 确保硬件连接正确: - 将ADS1118的CS引脚直接与GND相连,确保SPI通信时CS引脚始终为低电平。 - 连接ADS1118的VDD和GND引脚,为模数转换器提供电源。 - 连接ADS1118的SCK、SDI、SDO引脚到STM32的相应SPI引脚。 2. 配置STM32的SPI模块: - 设置CPOL为低电平(CPOL = 0)。 - 设置CPHA为下降沿(CPHA = 0)。 - 选择合适的时钟频率,例如1MHz或更高。 3. 初始化ADS1118: - 发送配置寄存器的设置,以配置ADS1118的工作模式、增益、采样速率等参数。您可以查阅ADS1118的数据手册,了解如何设置这些参数。 4. 读取温度数据: - 发送读取温度数据的命令(例如0x00)。 - 从SDO引脚接收温度数据。 - 将接收到的数据转换为实际温度值。您可以查阅ADS1118的数据手册,了解如何将原始数据转换为温度值。 5. 处理数据: - 根据需要对温度数据进行进一步处理,例如滤波、报警等。 以下是一段示例代码,展示如何使用STM32的SPI模块与ADS1118进行通信: ```c #include "stm32f1xx_hal.h" SPI_HandleTypeDef hspi1; void ADS1118_Init(void) { // 初始化SPI接口 hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10; HAL_SPI_Init(&hspi1); } uint8_t ADS1118_ReadTemperature(void) { uint8_t cmd = 0x00; // 读取温度数据的命令 uint8_t data[2]; // 发送命令 HAL_SPI_Transmit(&hspi1, &cmd, 1, 1000); // 接收数据 HAL_SPI_Receive(&hspi1, data, 2, 1000); // 将接收到的数据转换为温度值 int16_t temp_raw = (data[0] << 8) | data[1]; float temp = (temp_raw * 0.0625) - 256; return temp; } int main(void) { HAL_Init(); ADS1118_Init(); while (1) { float temp = ADS1118_ReadTemperature(); // 处理温度数据 } } ``` 希望这些建议和示例代码能帮助您解决关于ADS1118模数转换器的问题。如果您还有其他问题,请随时提问。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
586 浏览 0 评论
1644 浏览 0 评论
2082 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1534 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1375 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1787浏览 29评论
2812浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1746浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1657浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1676浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-11 05:11 , Processed in 1.140114 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2976