#define FM24C64_C
/* Includes ------------------------------------------------------------------*/
#include "fm24c64.h"
//#define USE24LC64
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
u8 IFACK; //record the SDA state to confirn if ACK has happened
u8 NO_ACK; //no ack flag
u8 BUS_FAULT; //bus fault flag
void start(void)
{
Reset_SCL;
Set_SDA;
Set_SCL;
DelayIIC(1);
Reset_SDA;
DelayIIC(1);
Reset_SCL;
Set_SDA;//==
}
//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
void stop(void)
{
Reset_SCL;
Reset_SDA;
Set_SCL;
DelayIIC(1);
Set_SDA;
DelayIIC(1);
Reset_SCL;
}
//=====================================
//FUNCTION:ROUTES TO PROVIDE ACK SINGAL
void ack(void)
{
/*
Reset_SCL;
Reset_SDA;
Set_SCL;
Reset_SCL;
*/
Reset_SDA;
Set_SCL;
DelayIIC(1);
Reset_SCL;
DelayIIC(1);
Set_SDA;
}
//=====================================
//FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
// OR TO PROVIDE A NO_ACK SIGNAL
//type=1等待应答信号
//type=0 产生无应答信号
void nack(u8 type)
{
Reset_SCL;
Set_SDA;
Set_SCL;
DelayIIC(1);
IFACK=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
Reset_SCL;
if(type){
if(IFACK){//如果无应答信号,则置标志位NO_ACK,程序中止
NO_ACK=1;//用户可以加入自己的异常处理程序
//while(1);
}else NO_ACK=0;
}
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
u8 inbyte(void) //从IIC器件中读出数据
{
u8 i = 8, d=0;
Reset_SCL;
while ( i--){
d = d << 1;
Set_SCL;
if ( GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7) )
d|=1;
Reset_SCL;
}
return d;
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
void outbyte(u8 outdata)
{//将数据写放IIC器件
u8 i = 8;
// bit bit_ack;
while( i-- ){
Reset_SCL;
if(outdata&0x80) {
Set_SDA;
}else{
Reset_SDA;
}
Set_SCL;
outdata = outdata << 1;
}
Reset_SCL;
}
//======================================================
//FUNCTION:BYTE WRITE. 'add' THE WRITE ADDRESS, 'wbyte' THE DATA WANT TO WRITE
void writebyte(u16 add,u8 wbyte)//add为写入地址,wbyte为写入数据
{
#ifdef USE24LC64
u8 temph,templ;
temph=(u8)(add/256);
templ=(u8)(add%256);
//config_gpio_sda(1);
start(); //开始信号
outbyte(IIC_WRITE); //写命令
nack(1); //等待应答
outbyte(temph); //写地址
nack(1); //等待应答
outbyte(templ); //写地址
nack(1);
outbyte(wbyte); //写数据
nack(1); //等待应答
stop(); //停止信号
#else
u8 temp;
temp=IIC_WRITE;
if(add>>8){temp|=0x02;}
start(); //开始信号
outbyte(temp); //写命令
nack(1);
outbyte((u8)add); //写地址
nack(1); //等待应答
outbyte(wbyte); //写数据
nack(1); //等待应答
stop(); //停止信号
#endif
}
//=====================================================
//FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
u8 readbyte (u16 add)//add为读地址
{
#ifdef USE24LC64
u8 temp,temph,templ;
temph=(u8)(add/256);
templ=(u8)(add%256);
start(); //开始信号
outbyte(IIC_WRITE); //写命令
nack(1); //等待应答
outbyte(temph); //写地址
nack(1); //等待应答
outbyte(templ); //写地址
nack(1);
start(); //开始信号
outbyte(IIC_READ); //读命令
nack(1); //等待应答
temp=inbyte(); //读数据
nack(0); //无应答
stop(); //停止信号
return(temp);
#else
u8 temp,tempr;
temp=IIC_WRITE;
tempr=IIC_READ;
if(add>>8){temp|=0x02;tempr|=0x02;}
start(); //开始信号
outbyte(temp); //写命令
nack(1); //等待应答
outbyte((u8)add); //写地址
nack(1); //等待应答
start(); //开始信号
outbyte(tempr); //读命令
nack(1); //等待应答
temp=inbyte(); //读数据
nack(0); //无应答
stop(); //停止信号
return(temp);
#endif
}
//=================================================
//连写函数
//add为读起始地址,ptr数据保存指针,writelen为写入数据长度
void writebyteseq(u16 add,u8 *ptr,u16 writelen)
{
u8 temp;
uint i;
temp=IIC_WRITE;
if(add>>8){temp|=0x02;}
start();
outbyte(temp);
nack(1);
outbyte((u8)add);
nack(1);
for(i=0;i<writelen;i++){
outbyte(*(ptr+i));
nack(1);
}
stop();
}
//=================================================
//连读函数
//add为读起始地址,ptr数据保存指针,writelen为读出数据长度
void readbyteseq(u16 add,u8 *ptr,u16 readlen)
{
u8 temp,tempr;
uint i;
temp=IIC_WRITE;
tempr=IIC_READ;
if(add>>8){temp|=0x02;tempr|=0x02;}
start();
outbyte(temp);
nack(1);
outbyte((u8)add);
nack(1);
start();
outbyte(tempr);
nack(1);
for(i=0;i<readlen-1;i++){
*(ptr+i)=inbyte();
ack();
}
*(ptr+readlen-1)=inbyte();
nack(0);
stop();
}
void DelayIIC(vu32 m)
{
//u32 i;
return;
/*for(; m != 0; m--)
for (i=0; i<100; i++);*/
}
void FMwriteBlock(unsigned int addr,unsigned char *pdest,unsigned char len)
{
unsigned char i;
//EA = 0;
for(i=0;i<len;i++){
writebyte(addr+i,*pdest++);
}
//EA = 1;
}
void FMreadBlock(uint addr,unsigned char *pdest,unsigned char len)
{
unsigned char i;
//EA = 0;
for(i=0;i<len;i++){
*pdest++=readbyte(addr+i);
}
//EA = 1;
}
void Test_tiedian(void)
{
/*
unsigned char ii;
unsigned char p2[256];
int rdcurp=0;
for(ii=0;ii<10;ii++);
p2[ii]=0;
writebyte(0x10,0x31);
writebyte(0x11,0x45);
writebyte(0x12,0x54);
writebyte(0x13,0x78);
writebyte(0x14,0x19);
writebyte(0x15,0x27);
writebyte(0x16,0x36);
writebyte(0x17,0x92);
writebyte(0x18,0x87);
for(rdcurp=0;rdcurp<11;rdcurp++){
p2[rdcurp]=readbyte(0x10+rdcurp);
}
*/
}