bk2461 使用i2c驱动eeprom at24c02

    最近使用bk2461无线单片机, 由于单片机内部没有掉电不丢失存储空间,需要外挂一个eeprom,使用i2c通信。找了原厂要了i2c的demo程序,但是搞了几天才搞定,现在把遇到的问题列出了。

1. gpio初始化

scl , sda 设置为输出,不开漏 (这个需要根据实际电路选择,如果没有接上拉电阻,则GPIO必须设置为上拉。如果接了上拉电阻,则GPIO可以设置为上拉,也可以设置为开漏)

2.  start 需要将scl sda 置1

void IIC_Start(void)
{
//if(NVR_RW_ENABLE_Word!=ENABLE_NVR_RW)
    //return;
    SDA_DIR_OUT();
    SDA=1;
    delay(1);
    SCL=1;
    delay(1);
    SDA=0;
    delay(1);
    SCL=0;
}

3. write eeprom完之后需要间隔一段时间之后才能read, 间隔时间设置为10ms左右(我在测试i2c代码的时候,是先往eeprom中写入一段数据,然后再读取数据,判断是否是正确的。但是我在读和写直接没有时间间隔,导致一直读取到错误的数据)

4. 延时是可变的     delay(1)~delay(10),这个根据单片机的晶振调整,我的单片机是16M

void delay(uint8 dly){
     while(dly-->0);
}

5. 在read eeprom过程中,在写完device addr和reg addr之后,和在写下一个device的时候,可以发送停止信号,也可以不发送停止信号

 if(_TxByte(devAddr<<1))return(0);
    //regAaddr
    if(_TxByte(regAaddr))return(0);
    I2C_STP();            //这里的停止可要可不要
    delay(10);
    I2C_SB();
    //devAddr
    if(_TxByte((devAddr<<1)|1))return(0);

6, 在读写eeprom时候,需要将最好将定时中断关掉,在有些场合下有可能会影响读写时序,从而导致读写失败

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA读写EEPROM芯片AT24C02实验Verilog逻辑源码Quartus11.0工程文件, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 module iic_com( clk,rst_n, sw1,sw2, scl,sda, dis_data ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output[7:0] dis_data; //数码管显示的数据 //按键检测 reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值 reg[19:0] cnt_20ms; //20ms计数寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_20ms <= 20'd0; else cnt_20ms <= cnt_20ms+1'b1; //不断计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1 sw2_r <= 1'b1; end else if(cnt_20ms == 20'hfffff) begin sw1_r <= sw1; //按键1值锁存 sw2_r <= sw2; //按键2值锁存 end end //--------------------------------------------- //分频部分 reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间 reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟 reg scl_r; //时钟脉冲寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_delay <= 9'd0; else if(cnt_delay == 9'd499) cnt_delay <= 9'd0; //计数到10us为scl的周期,即100KHz else cnt_delay <= cnt_delay+1'b1; //时钟计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 3'd5; else begin case (cnt_delay) 9'd124: cnt <= 3'd1; //cnt=1:scl高电平中间,用于数据采样 9'd249: cnt <= 3'd2; //cnt=2:scl下降沿 9'd374: cnt <= 3'd3; //cnt=3:scl低电平中间,用于数据变化 9'd499: cnt <= 3'd0; //cnt=0:scl上升沿 default: cnt <= 3'd5; endcase end end `define SCL_POS (cnt==3'd0) //cnt=0:scl上升沿 `define SCL_HIG (cnt==3'd1) //cnt=1:scl高电平中间,用于数据采样 `define SCL_NEG (cnt==3'd2) //cnt=2:scl下降沿 `define SCL_LOW (cnt==3'd3) //cnt=3:scl低电平中间,用于数据变化 always @ (posedge clk or negedge rst_n) begin if(!rst_n) scl_r <= 1'b0; else if(cnt==3'd0) scl_r <= 1'b1; //scl信号上升沿
使用FM33LE0来驱动AT24C02芯片的I2C通信,并配置I2C时钟,你可以按照以下步骤进行操作: 1. 配置I2C引脚:首先,将FM33LE0的I2C引脚与AT24C02芯片的对应引脚连接。常见的I2C引脚为SCL(时钟线)和SDA(数据线),确保正确连接这些引脚。 2. 初始化I2C模块:在代码中,你需要初始化FM33LE0的I2C模块。你可以使用FM33LE0提供的相关库函数来完成此操作。通常,你需要设置I2C的时钟频率和其他相关参数。 例如,使用`I2C_Init()`函数进行I2C模块的初始化,设置时钟频率和其他参数。示例代码如下: ```c I2C_Init(I2C0); // 初始化I2C0模块 I2C_Open(I2C0, 100000); // 设置I2C时钟频率为100kHz ``` 在上述代码中,我们使用了`I2C0`作为I2C模块,并将时钟频率设置为100kHz。 3. 设置AT24C02芯片的地址:每个I2C设备都有一个唯一的地址。你需要设置AT24C02芯片的地址,以便可以与其进行通信。通常情况下,AT24C02芯片的地址是0x50。 例如,使用`I2C_SetSlaveAddr()`函数设置AT24C02芯片的地址。示例代码如下: ```c I2C_SetSlaveAddr(I2C0, 0x50, I2C_ADDR_7BIT); ``` 在上述代码中,我们使用了`I2C0`作为I2C模块,并将AT24C02芯片的地址设置为0x50。 4. 发送读写指令:使用相关的I2C库函数,你可以发送读写指令来与AT24C02芯片进行通信。例如,你可以使用函数`I2C_WriteByte()`来向芯片写入数据,使用函数`I2C_ReadByte()`来读取芯片中的数据。 例如,使用`I2C_WriteByte()`函数向AT24C02芯片写入数据。示例代码如下: ```c I2C_WriteByte(I2C0, data); ``` 在上述代码中,我们使用了`I2C0`作为I2C模块,并将`data`写入到AT24C02芯片中。 5. 访问AT24C02芯片:通过适当的I2C库函数,你可以发送读写指令和数据来访问AT24C02芯片。根据你的需求,你可以读取或写入数据到芯片中。 需要注意的是,具体的代码实现可能因为所使用的开发环境和库函数而有所不同。你可以参考FM33LE0的官方文档和相关示例代码来了解更多细节,并根据你的需求进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值