【问题解决记录】STM32F030C8读取CS1237采集模拟 |
您所在的位置:网站首页 › 6069h供电不稳 › 【问题解决记录】STM32F030C8读取CS1237采集模拟 |
问题描述
提示:这里描述项目中遇到的问题: 使用STM32F030C8读取CS1237采集模拟电压时,遇到CS1237的CONFIG寄存器无法读写正常的困扰;就是配置 RefOut_OFF | SpeedSelct_1280HZ | PGA_1 | CH_A 这些参数无法正确写入,实际是我要写入0x70,但是读出来是随机值;而修改代码,上电MCU直接读取CONFIG,得到数值是0x0C(和手册默认值是对应的,说明读操作正常)。 而直接读取CS1237的ADC转换数值是和外界输入电压是一致的,只是设置CONFG寄存器读写不一致。 原因分析:提示:这里填写问题的分析: 第一个想到的原因是,CS1237的操作时序问题,有几个注意点是: (1) 设置STM32的DOUT端口为INPUT,监测来自CS1237的DOUT电平,一般芯片上电后,CS1237的DOUT会不断地输出高脉冲(示波器测量约20us的高脉冲),代码中要监测到DOUT的”下降沿“,然后才是读写配置和读取ADC转换数值的操作; (2)参考了网络好多示例代码,尤其是”技小新“的CS1237模块,LCSC立创商城可以搜到有;我的代码基本和他的demo一样; (3)CS1237上电后需要延时300毫秒的启动时间?这个实际测试后发现,这个时间不是必须; 下面是关键部分的代码: #include "gp8211s.h" #include "main.h" #include "delay.h" uint8_t Gp8211s_Channel_Sel; void Gp8211s_Choose_Channel(uint8_t ch) { if( !ch ) Gp8211s_Channel_Sel = 0; else Gp8211s_Channel_Sel = 1; } void Gp8211s_SCL_Clr() { if( !Gp8211s_Channel_Sel ) HAL_GPIO_WritePin(GP1_SCLK_GPIO_Port, GP1_SCLK_Pin, GPIO_PIN_RESET); else HAL_GPIO_WritePin(GP2_SCLK_GPIO_Port, GP2_SCLK_Pin, GPIO_PIN_RESET); } void Gp8211s_SCL_Set() { if( !Gp8211s_Channel_Sel ) HAL_GPIO_WritePin(GP1_SCLK_GPIO_Port, GP1_SCLK_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(GP2_SCLK_GPIO_Port, GP2_SCLK_Pin, GPIO_PIN_SET); } void Gp8211s_SDA_Clr() { if( !Gp8211s_Channel_Sel ) HAL_GPIO_WritePin(GP1_SDA_GPIO_Port, GP1_SDA_Pin, GPIO_PIN_RESET); else HAL_GPIO_WritePin(GP2_SDA_GPIO_Port, GP2_SDA_Pin, GPIO_PIN_RESET); } void Gp8211s_SDA_Set() { if( !Gp8211s_Channel_Sel ) HAL_GPIO_WritePin(GP1_SDA_GPIO_Port, GP1_SDA_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(GP2_SDA_GPIO_Port, GP2_SDA_Pin, GPIO_PIN_SET); } void Gp8211s_IIC_SdaOut() { GPIO_InitTypeDef GPIO_InitStruct; if( !Gp8211s_Channel_Sel ) { GPIO_InitStruct.Pin = GP1_SDA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init( GP1_SDA_GPIO_Port, &GPIO_InitStruct ); } else { GPIO_InitStruct.Pin = GP2_SDA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init( GP2_SDA_GPIO_Port, &GPIO_InitStruct ); } } void Gp8211s_IIC_SdaIn() { GPIO_InitTypeDef GPIO_InitStruct; //return; if( !Gp8211s_Channel_Sel ) { GPIO_InitStruct.Pin = GP1_SDA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init( GP1_SDA_GPIO_Port, &GPIO_InitStruct ); } else { GPIO_InitStruct.Pin = GP2_SDA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init( GP2_SDA_GPIO_Port, &GPIO_InitStruct ); } } void Gp8211s_IIC_Init() { Gp8211s_IIC_SdaOut(); Gp8211s_SDA_Set(); Gp8211s_SCL_Set(); delay_us(10); } void Gp8211s_IIC_Start(void) { Gp8211s_IIC_SdaOut(); Gp8211s_SDA_Set(); Gp8211s_SCL_Set(); delay_us(10); Gp8211s_SDA_Clr(); delay_us(10); } void Gp8211s_IIC_Stop(void) { Gp8211s_IIC_SdaOut(); Gp8211s_SDA_Clr(); Gp8211s_SCL_Set(); delay_us(10); Gp8211s_SDA_Set(); delay_us(10); } void Gp8211s_IIC_SendByte(uint8_t txd) { uint8_t t; uint8_t tdata = txd; Gp8211s_IIC_SdaOut(); Gp8211s_SCL_Clr(); delay_us(10); for(t=0; t |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |