发布STM32的I2C_EEPROM读写文件,可读写24C01-24C512
看到很多网友说STM32的I2C不好调的,可以参考我这个,经测试可以在EK-STM32F板子上跑24C02点击此处下载 ourdev_403743.rar(文件大小:4K) (原文件名:STM32_I2C.rar) 在调试的时候发现当I2C的频率调到100K以上频繁地读写将会使程序死等。。。。
----->程序中在不足的地方,请大家指正 你的程序我下载测试了,程序只能运行一次,我感觉没有正确退出,在主程序中重新调用函数再次写入和读出时就死了, 我仿真时看到大约停在while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));这个函数里了,还有复位后不能再读,必须断电才能再运行一次,好象STM32库也有这个问题,我没解决。我用的是STM32103E-EVAL板子 我也试试 本帖最后由 yuzhi2222 于 2013-1-12 11:15 编辑
用I2C模块不可靠,用模拟的好
/**************************************/
void startPCF(void) //SCL为高时,SDA由高变低
{
PCFSDA_H;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSDA_L;
delay_s(10);
PCFSCL_L;
delay_s(10);
}
/**************************************/
void stopPCF(void) //SCL为高时,SDA由低变高
{
PCFSDA_L;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSDA_H;
delay_s(10);
}
/**************************************/
void ackPCF(void)
{
PCFSDA_L;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSCL_L;
delay_s(10);
}
/**************************************/
void nackPCF(void)
{
PCFSDA_H;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSCL_L;
delay_s(10);
}
/**************************************/
uint32 testackPCF(void)
{
uint32 ackbit=0;
PCFSDA_H;
PCFSCL_H;
delay_s(10);
PCFSDA_in;
delay_s(10);
if(GPIOB->IDR&SDA_pin)ackbit=1;
delay_s(10);
PCFSCL_L;
PCFSDA_out;
GPIOB->ODR =((GPIOB->ODR&0xfffe)|key_pin);
delay_s(10);
return(!ackbit);
}
/**************************************/
void sendPCF(uint8 send_byte)
{
uint32 i;
for(i=0;i<8;i++)
{
if((send_byte&0x80)==0x80)PCFSDA_H;
else
PCFSDA_L;
delay_s(10);
PCFSCL_H;
delay_s(10);
PCFSCL_L;
send_byte<<=1;
delay_s(10);
}
}
/**************************************/
uint8 receivePCF(void)
{
uint8rcv_byte=0;
uint32 i;
PCFSDA_H;
delay_s(10);
PCFSDA_in;
for(i=0;i<8;i++)
{
delay_s(10);
PCFSCL_H;
delay_s(10);
rcv_byte<<=1;
if(GPIOB->IDR&SDA_pin)rcv_byte|=0x01;
PCFSCL_L;
}
PCFSDA_out;
GPIOB->ODR =((GPIOB->ODR&0xfffe)|key_pin);
delay_s(10);
return(rcv_byte);
}
/**********************连续写******************/
void burstwritePCF(void)
{
uint32 i;
startPCF();
sendPCF(0xa2);
while(testackPCF()==0);
sendPCF(0x02);
while(testackPCF()==0);
for(i=0;i<7;i++)
{
sendPCF(snd_buff);
while(testackPCF()==0);
}
stopPCF();
}
/**********************连续读******************/
void burst_readPCF(void)
{
uint32 i;
startPCF();
sendPCF(0xa2);
while(testackPCF()==0);
sendPCF(0x02);
while(testackPCF()==0);
startPCF();
sendPCF(0xa3);
while(testackPCF()==0);
for(i=0;i<6;i++)
{
rtc_buff=receivePCF();
ackPCF();
}
rtc_buff=receivePCF();
nackPCF();
stopPCF();
}
STM32F103C8 + PCF8563T ,已运行一年半,稳定 我也试试!很强大 学习,谢谢!!! mark……
顶一个… 硬件的很容易有问题,现在正在调试模拟的当中 晚上试一下 mark{:lol:} 标记一下稍后用iic 很好的程序,试一下。 收藏了,谢谢楼主
页:
[1]