|
| 采购元器件好去处--维库电子市场网推荐 |
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
哪位大侠可以给我M8与AT24C08的通信代码 |
| 作者:wujian 栏目:单片机 |
| 哪位大侠可以给我M8与AT24C08的通信代码 我刚学AVR,正在用M8做验证实验,做了几个与AT24C08通信的代码都不成功,哪位高手有这方面的代码,可以贴一个给我参考一下吗?谢谢。 |
| 2楼: | >>参与讨论 |
| 作者: NE5532 于 2006-9-27 21:07:00 发布:
先调应答,不要想一口吃胖。 I2C协议必须看,跑不掉。 |
|
| 3楼: | >>参与讨论 |
| 作者: wujian 于 2006-9-28 10:49:00 发布:
谢谢你。我做了一个MEGA8与24C16通信的程序 可是每次调用C24Start,传送完SLA+W后,TW_STATUS返回0xf8,怎么这么怪?到底是怎么回事啊? /* 4M Hz CPU频率 */ #define F_CPU 4000000UL // 1 MHz #include <avr/io.h> #include <compat/twi.h> #include <avr/delay.h> #define BOOL unsigned CHAR #define TRUE 1 #define FALSE 0 #define EEADDR 0 // 寻址 #define EEWR 0 // 写 #define EERD 1 // 读 #define TwiStart() TWCR = _BV(TWINT)|_BV(TWSTA)|_BV(TWEN) #define TwiStop() TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTO) #define TWI_STATUS (TWSR & 0xF8) BOOL C24Start(unsigned CHAR addr, BOOL bWrite) { // 发送开始位 unsigned CHAR renum=10; // 重试次数 resend: TwiStart(); while(!(TWCR&_BV(TWINT))==0) ; SWITCH(TWI_STATUS) { case TW_START: case TW_REP_START: break; case TW_MT_ARB_LOST: renum --; if(renum == 0) return FALSE; goto resend; break; default: return FALSE; } // 发送地址和读写位 TWDR = addr|bWrite; TWCR = _BV(TWINT)|_BV(TWEN); // 清中断,开始传输 while((TWCR&_BV(TWINT))==0) ; if(bWrite == EEWR) // 主设备写模式 { SWITCH(TW_STATUS) { case TW_MT_SLA_ACK: // 从设备成功响应 break; case TW_MT_SLA_NACK: // 从设备未响应 renum --; if(renum == 0) return FALSE; TwiStop(); goto resend; break; default: PORTD = TW_STATUS; PORTB = 0x05; for(;;) ; TwiStop(); return FALSE; } }else{ if(TWI_STATUS != TW_MR_SLA_ACK&&TWI_STATUS != TW_NO_INFO) { PORTD = TWI_STATUS; PORTB = 0x33; for(;;) ; return FALSE; } } return TRUE; } // 写一个字节 BOOL WriteByte(unsigned CHAR dat) { TWDR = dat; TWCR = (1<<TWINT)|(1<<TWEN); // 启动发送数据 while(!(TWCR&(1<<TWINT))) // 等待发送完成 ; SWITCH(TW_STATUS) { case TW_MT_DATA_ACK: case TW_MT_SLA_NACK: case TW_MT_DATA_NACK: break; default: PORTB = 0x1f; PORTD = TW_STATUS; for(;;) ; return FALSE; } return TRUE; } BOOL C24WriteByte(unsigned CHAR addr,unsigned CHAR dat) { if(C24Start(0xa0,EEWR)) { if(WriteByte(addr)== FALSE) return FALSE; if(WriteByte(dat)== FALSE) return FALSE; } TwiStop(); return TRUE; } BOOL C24ReadByte(unsigned CHAR addr,unsigned CHAR *dat) { if(C24Start(0xa0,EEWR)) // 写设备号 { if(WriteByte(addr) == FALSE) // 写地址 { TwiStop(); return FALSE; } if(C24Start(0xa0,EERD)) // 开始读 { //TWCR = _BV(TWINT)|_BV(TWEN)|_BV(TWEA); TWCR = _BV(TWINT)|_BV(TWEN); // 发送NAK while (!(TWCR & (1<<TWINT))) ; SWITCH(TWI_STATUS) { &nb |
|
|
|
| 免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |