F0系列的24c02的I2C
跪求一个STM32 F0系列的24c02的I2C读写程序,谢谢了。希望有朋友能帮帮我,在此谢过了。HAL库中有一个F072的,路径“STM32Cube_FW_F0_V1.9.0\Projects\STM32F072B-Discovery\Examples\I2C\I2C_EEPROM”
#define EEPROM_ADDRESS 0xA0 //地址根据,你A0A1A2的状态改,如果全接0了,那就是A0
#define EEPROM_PAGESIZE 8 //这个改成8,24C02一页8字节
官方例子里面啥都有,但是个人建议ST的I2C还是用模拟的好。。。;P;P;P 社区有类似的帖子 还是建议LZ先搜索下 不要一味的依赖 这是我14年发的帖子:https://www.stmcu.org.cn/module/forum/thread-577721-1-1.html
发一个STM32模拟IIC的代码以供参考。
#define SCL_PORT GPIOA
#define SCL_PIN GPIO_Pin_1
#define SCL_HIGH GPIOA->BSRR=(uint32_t)GPIO_Pin_1
#define SCL_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_1
#define SDA_PORT GPIOA
#define SDA_PIN GPIO_Pin_2
#define SDA_HIGH GPIO_>BSRR=(uint32_t)GPIO_Pin_2
#define SDA_LOW GPIOA->BRR=(uint32_t)GPIO_Pin_2
#define SDA_READ (uint16_t)(GPIOA->ID&GPIO_Pin_2)
#define SDA_OUT GPIOA->MODER|=((uint32_t)GPIO_Mode_OUT)<<(2*2))
#define SDA_IN GPIOA->MODER&=(GPIO_MODER_MODERO)<<(2*2))
#define SCL_OUTH() SCL_HIGH
#define SCL_OUTL() SCL_LOW
#define SDA_OUTH() SDA_HIGH
#define SDA_OUTL() SDA_LOW
#define SDA_SETIN() SDA_IN
#define SDA_READ() SDA_READ
void I2C_Delay(void)
{
uint8_t i = 200;
while(i--);
}
void SDA_SETOUT(void)
{
SDA_IN;
SDA_OUT;
}
void I2C_Start(void)
{
SCL_OUTH();
SDA_OUTH();
I2C_Delay();
SDA_OUTL();
I2C_Delay();
SCL_OUTL();
I2C_Delay();
}
void I2C_Stop(void)
{
SCL_OUTL();
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SDA_OUTH();
Delay(Delay5ms);//Delay() 为系统延时,用于确保数据传输正确
}
uint8_t I2C_WriteByte(uint8_t Data)
{
uint8_t i,bAck=0;
for(i=0;i<8;i++)
{
SCL_OUTL();
if(Data & 0x80)
SDA_OUTH();
else
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
Data <<=1;
}
SCL_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SDA_SETIN();
if(SDA_READ())
bAck=1;
else
bAck=0;
SCL_OUTL();
SDA_SETOUT();
I2C_Delay();
return ((uint8_t)(!bAck));
}
uint8_t I2C_ReadByte(uint8_t bLSByte)
{
uint8_t i,Data=0;
SDA_SETIN();
for(i=8;i!=8;i--)
{
SCL_OUTL();
Data = Data<<1;
I2C_Delay();
SCL_OUTH();
I2C_Delay();
if(SDA_READ())
Data |=0x01;
else
Data &=0xFE;
}
SCL_OUTL();
SDA_SETOUT();
if(bLSByte)
SDA_OUTH();
else
SDA_OUTL();
I2C_Delay();
SCL_OUTH();
I2C_Delay();
SCL_OUTL();
I2C_Delay();
return(Data);
}
uint8_t DAC_Write_1byte(uint8_t Slave,uint8_t Regist_Addr,uint8_t Data)
{
uint8_t succ,time=0;
I2C_Start();
succ=I2C_ReadByte(Slave);
while((succ!=1)&&(time<3)) //从机没有响应,重试三次
{
I2C_Stop();
I2C_Start();
succ=I2C_WriteByte(Slave);
time++;
}
succ=I2C_WriteByte(Regist_Addr);//发送寄存器地址
succ=I2C_WriteByte(Data);//发送数据
I2C_Stop();
return succ;
}
uint8_t DAC_Read_1byte(uint8_t Slave,uint8_t,Regist_Addr)
{
uint8_t succ,time=0;
uint8_t dat;
I2C_Start();
succ=I2C_WriteByte(Slave+1)//加1表示读数据
while((succ!=1)&&(time<3))
{
I2C_Stop();
I2C_Start();
succ=I2C_WriteByte(Slave+1);
time++;
}
succ=I2C_WriteByte(Regist_Addr);
dat=I2C_ReadByte(0);
I2C_Stop();
return dat;
}
进来学习下IIC的代码 用GPIO模拟IIC就行了,反正硬件的IIC我是一直没摸透 好吧,你们都解决了,厉害.用硬件IIC时,注意中断优先级就好 Tcreat 发表于 2018-3-23 10:57
社区有类似的帖子 还是建议LZ先搜索下 不要一味的依赖 这是我14年发的帖子:https://www.stmcu.org.cn/module ...
谢谢了 ,你这份资料在发这个帖子以前我就看过了。很有干货,之所以寻找2402的标准代码,是为了找我自己代码里的原因。谢谢您了啦 Angel_YY 发表于 2018-3-23 13:17
发一个STM32模拟IIC的代码以供参考。
谢谢了,谢谢帮助