• 大小: 4KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-19
  • 语言: 其他
  • 标签:

资源简介

有别于常规24C02的无限读,FM24C04读写都是有限次,而且很多资料的24C04我发现都无法用上,因此自己写了一个FM24C04驱动程序,并带有main测试程序。

资源截图

代码片段和文件信息

/*********************************************************************************
 * @file   : I2C.c
 * @author : eruca520@163.com
 * @version : V0.1
 * @date : 2016-09-28
 * @brief :
*********************************************************************************/
#define  _FM24C04_C 

//FM24C04 存储空间为 4K bits = 512 byte

#include “config.h“
#include “FM24C04.h“
#include 

uint8_t ram_acc = 0; // 发送命令、地址的 缓冲



// 短暂延时,用于IIC信号保持
void NOP1(void)
{
_nop_();
}

// 延时程序
void delay_ms(uint16_t cnt) 
{
xdata uint16_t ms = 360;

while(cnt--)
  {
while(ms--);
ms = 360;
}
}


// IIC总线的 开始态
// scl 高电平时,sda的下降沿
// 最后 scl 也拉低
void start_iic() 
{
NOP1(); 
  NOP1();
sda_iic = 1;
scl_iic = 1;
  NOP1(); 
  NOP1(); 
  NOP1();
  NOP1(); 
  NOP1();
sda_iic = 0;
NOP1(); 
  NOP1();
scl_iic = 0;
NOP1();
}

// IIC总线的 停止态
// scl 高电平时,sda 的上升沿
// 数据写操作,最后是要延时 5ms的
void stop_iic(void) 
{
sda_iic = 0;
scl_iic = 1;
NOP1(); 
  NOP1(); 
  NOP1();
sda_iic = 1;
NOP1(); 
  NOP1();
scl_iic = 1;
delay_ms(5);
}

// 读命令的 停止态
// IO与上相同,最后无延时
void rstop_iic(void) 
{
sda_iic = 0;
scl_iic = 1;
NOP1(); 
  NOP1(); 
  NOP1();
sda_iic = 1;
NOP1(); 
  NOP1();
scl_iic = 1;
}

// IIC 写 应答操作
// sda 低电平,scl 上升再上降
void ack_iic(void) 
{
scl_iic = 0;
sda_iic = 0;
NOP1(); 
  NOP1();
scl_iic = 1;
sda_iic = 0;
NOP1(); 
  NOP1();
scl_iic = 0;
}

// IIC 读 应答
void rack_iic(void)
{
xdata uint16_t temp = 0;
  
scl_iic = 0;
sda_iic = 1;
NOP1(); 
  NOP1();
scl_iic = 1;
sda_iic = 1;
while(sda_iic == 1 && temp < 2000) 
{   
temp++;
}
NOP1(); 
  NOP1();
scl_iic = 0;
}

// 写 应答
void wack_iic(void)
{
xdata uint16_t temp = 0;
  
scl_iic = 0;
sda_iic = 1;
NOP1(); 
  NOP1();
scl_iic = 1;
sda_iic = 1;
while(sda_iic == 1 && temp < 2000) 
{   
temp++;
}
NOP1(); 
  NOP1();
scl_iic = 0;
}

// IIC 无 应答
void noack_iic(void) 
{
scl_iic = 0;
sda_iic = 1;  
NOP1(); 
  NOP1();  
scl_iic = 1;
sda_iic = 1;
NOP1(); 
  NOP1();  
scl_iic = 0;
}

// 发送一字节 数据
void I2C_WriteByte(void) 
{   
uint8_t n = 8;
  
do 
  {
scl_iic = 0;
NOP1();
    NOP1();
if((ram_acc&0x80)==0x80)
sda_iic = 1;
else
sda_iic = 0;
ram_acc = (ram_acc<<1);
n--;
NOP1();
    NOP1();
scl_iic = 1;
NOP1();
    NOP1();
    NOP1();
}while(n);
scl_iic  = 0;
}

// 读一字节数据
void I2C_ReadByte(void) 
{
uint8_t i = 8;
  
sda_iic = 1;
do {
ram_acc = (ram_acc<<1);
scl_iic = 0;
NOP1();
    NOP1();
    NOP1();
scl_iic = 1;
NOP1();
if(sda_iic == 1)
ram_acc = (ram_acc | 0x01);
else
ram_acc = (ram_acc & 0xfe);
i--;
NOP1();
}while(i);
scl_iic = 0;
}




// 从 指定地址,读出 1字节 数据
/**
  * @brief  从指定扇区的地址,读出1字节数据
  * @param  pageblock - 指定扇区
  *         addr - 指定扇区的地址
  * @retval None
  */
uint8_t E2ReadByte(uint8_t pageblock uint8_

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7487  2018-07-05 11:17  FM24C04\FM24C04.c

     文件       2134  2018-07-05 11:18  FM24C04\FM24C04.h

     文件       2331  2018-07-05 12:36  FM24C04\main.c

     目录          0  2018-07-05 11:20  FM24C04

----------- ---------  ---------- -----  ----

                11952                    4


评论

共有 条评论

相关资源