最近调试i2c遇到一些问题,在此备忘,总结一句话,还是要特别注意时序,哪怕一个高低点平的错误都可能导致程序工作不正常
另外对于stm32 提供的i2c固件例程一直没有调好,特别烦人
#include "SystemInit.h"
#include <stdint.h>#include "stm32_eval_i2c_ee.h"
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Send_Byte(u8 txd);
u8 IIC_Read_Byte(unsigned char ack);
u8 IIC_Wait_Ack(void);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
__IO uint32_t timeremain = 0;
void delay_us(__IO uint32_t arg)
{
volatile uint16_t i = 0;
#if 0
while(arg--)
{
for(i = 5; i > 0; i--);
}
#else
timeremain = arg;
EnableTimer2();
while(timeremain)
{
}
#endif
}
/*
#define SDA_IN() {IIC_SDA_PORT->CRH&=0XFFFF0FFF;IIC_SDA_PORT->CRH|=8<<12;}
#define SDA_OUT() {IIC_SDA_PORT->CRH&=0XFFFF0FFF;IIC_SDA_PORT->CRH|=3<<12;}
*/
#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))
#define IIC_SCL_PORT GPIOD
#define IIC_SCL_CLK RCC_APB2Periph_GPIOD
#define IIC_SCL_PIN GPIO_Pin_8
#define IIC_SDA_PORT GPIOD
#define IIC_SDA_CLK RCC_APB2Periph_GPIOD
#define IIC_SDA_PIN GPIO_Pin_9
void SDA_IN()
{