用TWI中断对24c16的字节读写 共享
//TWI初始化TWSR=0x00;
TWBR=0x06;
TWAR=0x01;
TWCR=0x41;
//TWI中断函数
SIGNAL(SIG_2WIRE_SERIAL)
{//IIC中断
switch(eep_int_seq)
{
case 1 :
{
if((TWSR&0xf8) != 0x08)
{//发送start信号出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送start信号成功
TWDR=slave_rw&0xfe; //发送器件地址
TWCR &= ~0x20; //清start发送标志
}
break;
}
case 2 :
{
if((TWSR&0xf8) != 0x18)
{//发送器件地址出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送器件地址成功
TWDR=eeprom_addr;
}
break;
}
case 3 :
{
if((TWSR&0xf8) != 0x28)
{//发送eeprom地址出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送eeprom地址成功
if((slave_rw&0x01)==0)//写数据进eeprom
TWDR=eeprom_data;
else
{//从eeprom读数据
TWCR = 0xa5; //重新启动start信号
eep_int_seq++;
return;
}
}
break;
}
case 4 :
{
if((slave_rw&0x01)==0)
{//写eeprom
if((TWSR&0xf8) != 0x28)
{//发送eeprom数据出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送eeprom数据成功
eep_int_seq=0;//0xff;
write_eep_flag=YES; //写eeprom延时标志
TWCR = 0x94; //发送停止信号
return;
}
}
else
{//读eeprom
if((TWSR&0xf8) != 0x10)
{//重发start信号出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//重发start信号成功
TWDR=slave_rw; //发器件地址
TWCR &= ~0x20; //清start发送标志
}
}
break;
}
case 5 :
{
if((TWSR&0xf8) != 0x40)
{//发送器件地址出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
// else
// TWCR |= 0x04; //slave_rw发送成功,并接收到ack
break;
}
case 6 :
{
if((TWSR&0xf8) != 0x50 && (TWSR&0xf8) != 0x58)
{
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送器件地址成功
eep_int_seq=0;//0xff;
//write_eep_flag=YES;
get_eeprom_data=TWDR;
TWCR |= 0x94;//发送停止信号
return;
}
break;
}
default : break;
}
eep_int_seq++;
TWCR |= 0x80; //清TWINT标志
}
//AT24C16的字节读写函数
void OprateEepromByte(unchar read_flag,unchar byte_addr,unchar byte_data)
{
slave_rw=(read_flag&0x0f)|0xa0;
eeprom_addr=byte_addr;
eeprom_data=byte_data;
eep_int_seq=1;
TWCR |= 0xa4; //启动start信号
}
-----此内容被wogudan于2005-06-02,17:11:40编辑过 好像中断服务程序长了一些 难得一见的TWI中断源码,不错!!!
值得鼓励!!! 我试了一下为什么不能进入中断呀 很久没看看,没想到还有人看啊!这是第一次调的,后来随着产品需要,做了点调整!
用是可以用的,中断服务程序用case判断的啊,每一次只会进一个case的!
fhpxagu不能进中断,我估计是你的设置的问题! fhpxagu
初始化程序没写吧? 总感觉用IIC做通信效率比较低,中断里面一大串的程序
虽说每次只进去一个CASE,但是看起来有点头晕~~~~~~ 都沉底了,顶起来! IIC还是喜欢用口线模拟,用硬件原理都看的晕死了。 程序没问题,不过觉得麻烦了点,当然楼主还是做得很好的 厉害! 问一下楼主,硬件就只接了SDA和SCL吗
程序中的get_eeprom_data变量是干啥用的
谢谢 拜托,个人比较偷懒,所以有现成的东西不想多考虑,不过这里发的东西能否全一些,有时看程序比写程序还麻烦,以前买书时最讨厌书中的例子,如果全错没问题,就是少打个符号,写错个字母,不得不寻寻觅觅;你这些中断里的变量是在哪定义的?还要猜YES有什么来代替?
为了写一个MEGA64用24C16的程序,想想有现成的,在这找了半天,那么多,就是没一个用得起来。郁闷。
当然起因是我懒,所以不好怨别人,不过给了希望又不能实现也实在是烦啊 楼主,你在中断里做这么多东西是不是不太合适啊? 顶起来,有时间试一下 24C16是的2K地址空间,用一个字节的byte_addr怎么可以去访问2K的字节呢? http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=873758&bbs_id=9999
能不能帮我看看我的问题?谢谢了 这样做的话,只能寻址0~FF吧,大于FF呢? 感觉还是模拟的IIC好用,那个硬件的IIC操作起来感觉太复杂 能不能增加页读写?页读点有难度。
页:
[1]