上传一个软件模拟的I2C C程序给在家
在ICC AVR6.30 AVRSTUDIO JIAGICE II M162 上调试通过#define SCLA5
#define SDA 6
/*读fm24cl16 读n字节子程式*/
/*读字节数,存数据起始位置,页地址,读地址*/
void fm24cl16_read(unsigned char r_byte_d,unsigned char sav_bit,unsigned char page_adder,unsigned char read_adder)
{
unsigned char cont;
WDR();
fm24cl16_start_bit();
fm24cl16_txce_byte(page_adder);
fm24cl16_txce_byte(read_adder);
fm24cl16_start_bit();
setbit(page_adder,0);
fm24cl16_txce_byte(page_adder);
WDR();
for(cont=1;cont<r_byte_d;++cont)
{
temp_data=fm24cl16_rece_byte();
++sav_bit;
setbit(DDRB,SCLA);
setbit(DDRB,SDA);
WDR();
NOP();
NOP();
clrbit(PORTB,SDA);
NOP();
NOP();
NOP();
setbit(PORTB,SCLA);
NOP();
NOP();
NOP();
clrbit(PORTB,SCLA);
NOP();
}
temp_data=fm24cl16_rece_byte();
++sav_bit;
setbit(DDRB,SCLA);
setbit(DDRB,SDA);
WDR();
NOP();
NOP();
setbit(PORTB,SDA);
clrbit(PORTB,SCLA);
NOP();
NOP();
NOP();
setbit(PORTB,SCLA);
NOP();
NOP();
NOP();
clrbit(PORTB,SCLA);
NOP();
fm24cl16_stop_bit();
}
/*写fm24cl16 n字节子程式*/
/*发送字节数,发送数据的起始位,页地址,写地址*/
void fm24cl16_writ(unsigned char t_byte_d,unsigned char sent_bit,unsigned char page_adder,unsigned char writ_adder)
{
unsigned char cont,sent_cont;
WDR();
sent_cont=sent_bit;
fm24cl16_start_bit();
fm24cl16_txce_byte(page_adder);
fm24cl16_txce_byte(writ_adder);
for(cont=1;cont<=t_byte_d;++cont)
{
fm24cl16_txce_byte(temp_data);
++sent_cont;
}
fm24cl16_stop_bit();
}
void fm24cl16_txce_byte(unsigned char sentdata) /*铁电存贮器单字节发送*/
{
unsigned char cont;
WDR();
for(cont=1;cont<=8;++cont)
{
setbit(DDRB,SDA);
setbit(DDRB,SCLA);
if(testbit(sentdata,7)) setbit(PORTB,SDA);
else clrbit(PORTB,SDA);
setbit(PORTB,SCLA);
NOP();
NOP();
NOP();
clrbit(PORTB,SCLA);
NOP();
sentdata=sentdata<<1;
}
clrbit(DDRB,SDA);
WDR();
NOP();
NOP();
timer0=0;
TCCR0=5; /*开定时器0*/
do
{
clrbit(PORTB,SCLA);
NOP();
NOP();
WDR();
setbit(PORTB,SCLA);
if(timer0==10) /*延时708mS 检测定时器是否是长时间没有应答位产生*/
{
; /*数据错误标识*/
WDR();
break;
}
}
while(testbit(PINB,SDA));
TCCR0=0;
clrbit(PORTB,SCLA);
}
unsigned char fm24cl16_rece_byte() /*铁电存贮器单字节接收*/
{
unsigned char rxdata,cont;
WDR();
rxdata=0;
clrbit(DDRB,SDA);
for(cont=1;cont<=8;++cont)
{
rxdata=rxdata<<1;
setbit(PORTB,SCLA);
NOP();
NOP();
NOP();
if(testbit(PINB,SDA)) setbit(rxdata,0);
clrbit(PORTB,SCLA);
NOP();
}
return rxdata;
}
void fm24cl16_start_bit(void)/*铁电存贮器的起始位*/
{
WDR();
setbit(DDRB,SCLA);
setbit(DDRB,SDA);
NOP();
NOP();
NOP();
setbit(PORTB,SDA);
setbit(PORTB,SCLA);
NOP();
NOP();
NOP();
clrbit(PORTB,SDA);
NOP();
NOP();
NOP();
clrbit(PORTB,SCLA);
NOP();
}
void fm24cl16_stop_bit(void)/*铁电存贮器的停止位*/
{
WDR();
setbit(DDRB,SDA);
setbit(DDRB,SCLA);
NOP();
NOP();
NOP();
clrbit(PORTB,SDA);
setbit(PORTB,SCLA);
NOP();
NOP();
NOP();
setbit(PORTB,SDA);
NOP();
NOP();
NOP();
clrbit(PORTB,SCLA);
NOP();
setbit(PORTB,SCLA);
} 实物图因现没有数码相机,我这是一个无线数据远传装置, 用PIC16F76*2的方案在天津运行八个月没有发现任何问题,用M162还用一小部分新增功能没有完成先,完成了再整理上传. 楼主:好人啊,我的EEPROM板子画错了,只能用这软件仿了. 这可是十年前的帖子啊
页:
[1]