资源简介
有别于常规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
- 上一篇:SWD模式下调试STM32程序的方法
- 下一篇:华为GPRS模块应用电路原理图
评论
共有 条评论