📄 iicfram.c
字号:
FRAM IIC SoftWare:
sbit sdar= P1^4; /*串行数据*/
sbit sclr= P1^5; /*串行时钟*/
bit ACK_flagr;
/************************函数列表**********************/
void delay(unsigned char ms);
void start(void);
void stop(void);
void ackr(void);
void noackr(void);
void sendbyte(unsigned char senddata);
unsigned char recbyte(void);
/*发送起始条件*/
void start(void) /*起始条件*/
{
sdar = 1;
_nop_ ();
sclr = 1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sdar = 0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sclr = 0;
_nop_ ();
}
void stop(void) /*停止条件*/
{
sdar=0;
_nop_ ();
sclr=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sdar=1;
_nop_ ();
}
void ackr(void) /*应答位*/
{
sdar=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sclr=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sclr=0;
}
void noackr(void) /*反向应答位*/
{
sdar=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sclr=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sclr=0;
}
/***************发送字节数据子程序*****************/
void sendbyte(unsigned char senddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
sdar=(bit)(senddata&0x80); /*取最高位*/
senddata=senddata<<1;
_nop_ ();
sclr=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sclr=0;
}
ackr();
_nop_();
_nop_();
_nop_();
_nop_();
if(sdar==1)
{
ACK_flagr=0; //数据发送错误
}
else
{
ACK_flagr=1; //数据发送正确
}
}
unsigned char recbyte(void)
{
unsigned char i;
unsigned char recdata=0; //接受到的数据
sdar=1;
for(i=0;i<8;i++)
{
_nop_ ();
sclr=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
sclr=1;
_nop_ ();
_nop_ ();
recdata=recdata<<1;
if(sdar==1)
{
recdata++;
_nop_ ();
_nop_ ();
}
sclr=0;
_nop_ ();
_nop_ ();
}
return(recdata);
}
bit WrToFRam(unsigned char slv_addr,unsigned int sub_addr,unsigned char *s,unsigned char no)
{
unsigned char i;
unsigned char addrh; //存放存储单元地址高8位
unsigned char addrl;
addrh = (char)(sub_addr/256); //取高八位
addrl = (char)(sub_addr & 0x00ff); //取低八位
start(); /*发送启动信号*/
sendbyte(slv_addr); /*发送SLA+W*/
if(ACK_flagr==0)
return(0);
sendbyte(addrh); /*发送高位地址*/
if(ACK_flagr==0)
return(0);
sendbyte(addrl); /*发送低位地址*/
if(ACK_flagr==0)
return(0);
for(i=0;i<no;i++)
{
sendbyte(*s);
if(ACK_flagr==0)
return(0);
s++;
}
stop();
return(1);
}
bit RdFromFRam(unsigned char slv_addr,unsigned int sub_addr,unsigned char *s,unsigned char no)
{
unsigned char addrh,addrl;//,tempdata; //存放存储单元地址高8位
unsigned char i;
addrh = (char)(sub_addr/256); //取高八位
addrl = (char)(sub_addr& 0x00ff);
start();
sendbyte(slv_addr-1);
if(ACK_flagr==0)
return(0);
sendbyte(addrh);
if(ACK_flagr==0)
return(0);
sendbyte(addrl);
if(ACK_flagr==0)
return(0);
stop();
_nop_();
_nop_();
start();
sendbyte(slv_addr);
if(ACK_flagr==0)
return(0);
for(i=0;i<no-1;i++)
{
*s=recbyte();
ackr();
s++;
}
*s=recbyte();
noackr();
sclr=0;
stop();
// return(tempdata);
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -