|
簡單描述一下我遇到的問題:了解到MCP3421是一塊精度很高的AD,而且利用I2C通信。所以想用32做一個(gè)簡單表頭。
搭建AD部分電路,我用的是官方應(yīng)用電路:
1.png (11.47 KB, 下載次數(shù): 109)
下載附件
2019-12-12 16:58 上傳
(這里VDD用的是5V電源,stm32用的是3.3V,電源是分開的)
然后接入到stm32f103c8的PB6,PB7。也就是I2C1接口。但是程序是模擬I2C(因?yàn)榫W(wǎng)上例程基本上都用模擬I2C),也就是我并沒有用到硬件I2C。
燒寫程序過后,無論仿真查看變量值還是實(shí)際顯示,都為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方向設(shè)置
- #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<8;}
- #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<8;}
- //IO操作函數(shù)
- #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所有操作函數(shù)
- void IIC_Init(void); //初始化IIC的IO口
- void IIC_Start(void); //發(fā)送IIC開始信號(hào)
- void IIC_Stop(void); //發(fā)送IIC停止信號(hào)
- void IIC_Send_Byte(u8 txd); //IIC發(fā)送一個(gè)字節(jié)
- u8 IIC_Read_Byte(void);//IIC讀取一個(gè)字節(jié)
- u8 IIC_Wait_Ack(void); //IIC等待ACK信號(hào)
- void IIC_Ack(void); //IIC發(fā)送ACK信號(hào)
- void IIC_NAck(void); //IIC不發(fā)送ACK信號(hào)
- 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
復(fù)制代碼 "mcp.c"
最后在我的main函數(shù)里面
- 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);
- }
- }
復(fù)制代碼 這里用了printf函數(shù),網(wǎng)上有資料說不用在I2C通信時(shí)使用這個(gè)函數(shù),所以我注釋了過后再運(yùn)行查找變量,或者就是更改另一種顯示方法,始終都是讀不到電壓值的。求大佬不吝賜教,感激不盡!
|
|