简单描述一下我遇到的问题:了解到MCP3421是一块精度很高的AD,而且利用I2C通信。所以想用32做一个简单表头。
搭建AD部分电路,我用的是官方应用电路:
(这里VDD用的是5V电源,stm32用的是3.3V,电源是分开的)
然后接入到stm32f103c8的PB6,PB7。也就是I2C1接口。但是程序是模拟I2C(因为网上例程基本上都用模拟I2C),也就是我并没有用到硬件I2C。
烧写程序过后,无论仿真查看变量值还是实际显示,都为0。读不到电压值。想问问大佬问题出在哪呢,是I2C接口吗,还是另有原因?
附上我的程序:
"mcp.h"
- #ifndef __MCP_H
- #define __MCP_H
- #include "sys.h"
- #define IIC_SCL_PORT GPIOB
- #define IIC_SCL_CLK RCC_APB2Periph_GPIOB
- #define IIC_SCL_PIN GPIO_Pin_6
- #define IIC_SDA_PORT GPIOB
- #define IIC_SDA_CLK RCC_APB2Periph_GPIOB
- #define IIC_SDA_PIN GPIO_Pin_7
- #define MCP3421_12AD 0x80
- #define MCP3421_14AD 0x84
- #define MCP3421_16AD 0x88
- #define MCP3421_18AD 0x8c
-
- //IO方向设置
- #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<8;}
- #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<8;}
- //IO操作函数
- #define Set_IIC_SCL {GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN);}
- #define Clr_IIC_SCL {GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN);}
- #define Set_IIC_SDA {GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN);}
- #define Clr_IIC_SDA {GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN);}
- #define READ_SDA (GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN))
- //IIC所有操作函数
- void IIC_Init(void); //初始化IIC的IO口
- void IIC_Start(void); //发送IIC开始信号
- void IIC_Stop(void); //发送IIC停止信号
- void IIC_Send_Byte(u8 txd); //IIC发送一个字节
- u8 IIC_Read_Byte(void);//IIC读取一个字节
- u8 IIC_Wait_Ack(void); //IIC等待ACK信号
- void IIC_Ack(void); //IIC发送ACK信号
- void IIC_NAck(void); //IIC不发送ACK信号
- float READ_MCP3421(void);
- void WRITE_MCP3421(unsigned char wr_data);
- u32 Read_Mcp3421_Data(void);
- void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
- u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
- u32 Get_Adc(void);
- extern unsigned long int elech;
- extern unsigned long int elecl;
- extern unsigned long int elecm;
- extern unsigned long int mcp_busy;
- void IIC_Delay(void);
- void IIC_Start_Test(void);
- #endif
复制代码 "mcp.c"
最后在我的main函数里面
- int main(void)
- {
- float Vrm = 0.0;
- char DisBuf[200];
- IIC_Init();
- while(1)
- {
- WRITE_MCP3421(MCP3421_18AD);
- Vrm=READ_MCP3421();
- IIC_Delay();
- printf(" | V:%4.2f | \r\n",Vrm);
- sprintf(DisBuf,"% 4.2f",Vrm);
- LCD_ShowString(110,270, (u8*)DisBuf,DARKBLUE);
- }
- }
复制代码 这里用了printf函数,网上有资料说不用在I2C通信时使用这个函数,所以我注释了过后再运行查找变量,或者就是更改另一种显示方法,始终都是读不到电压值的。求大佬不吝赐教,感激不尽!
|