lisn3188 发表于 2008-9-5 20:03:51

发布STM32的I2C_EEPROM读写文件,可读写24C01-24C512

看到很多网友说STM32的I2C不好调的,可以参考我这个,经测试可以在EK-STM32F板子上跑24C02

点击此处下载 ourdev_403743.rar(文件大小:4K) (原文件名:STM32_I2C.rar)

lisn3188 发表于 2008-9-5 20:08:40

在调试的时候发现当I2C的频率调到100K以上频繁地读写将会使程序死等。。。。


----->程序中在不足的地方,请大家指正

xue110592 发表于 2008-11-25 10:32:47

你的程序我下载测试了,程序只能运行一次,我感觉没有正确退出,在主程序中重新调用函数再次写入和读出时就死了, 我仿真时看到大约停在while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));这个函数里了,还有复位后不能再读,必须断电才能再运行一次,好象STM32库也有这个问题,我没解决。我用的是STM32103E-EVAL板子

wxc806605298 发表于 2013-1-11 16:39:04

我也试试

yuzhi2222 发表于 2013-1-12 11:13:01

本帖最后由 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 ,已运行一年半,稳定

wxc806605298 发表于 2013-1-14 10:33:59

我也试试!很强大

dory_m 发表于 2013-2-1 08:18:12

学习,谢谢!!!

xiefy21 发表于 2013-8-12 20:08:26

mark……
顶一个…

flylokj 发表于 2013-11-17 15:27:49

硬件的很容易有问题,现在正在调试模拟的当中

newphj 发表于 2013-12-27 14:18:18

晚上试一下

464839941xql 发表于 2014-8-31 10:53:58

mark{:lol:}

whow 发表于 2014-9-27 10:42:08

标记一下稍后用iic

jiangbing 发表于 2014-9-27 13:09:21

很好的程序,试一下。

yanzhiwei 发表于 2015-12-6 10:24:50

收藏了,谢谢楼主
页: [1]
查看完整版本: 发布STM32的I2C_EEPROM读写文件,可读写24C01-24C512