資源簡介
有別于常規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模塊應用電路原理圖
評論
共有 條評論