共3条
1/1 1 跳转至页
M8,AT24C08 哪位大侠可以给我M8与AT24C08的通信代码
问
我刚学AVR,正在用M8做验证实验,做了几个与AT24C08通信的代码都不成功,哪位高手有这方面的代码,可以贴一个给我参考一下吗?谢谢。
答 1:
先调应答,不要想一口吃胖。I2C协议必须看,跑不掉。
答 2:
谢谢你。我做了一个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)
{
case TW_MT_DATA_ACK:
case TW_MR_SLA_NACK:
break;
case TW_MT_DATA_NACK:
TwiStop();
return FALSE;
default:
PORTB = 0x03;
PORTD = TWI_STATUS;
for(;;)
;
}
*dat = TWDR;
//TWCR = _BV(TWINT)|_BV(TWEN); // 发送NAK信号,表示是最后一个字节
TwiStop();
return TRUE;
}else{
return FALSE;
}
}else{
return FALSE;
}
return TRUE;
}
int main(void)
{
unsigned char tmp=0;
unsigned char buf[3]={0x10,0x11,0x12};
//TWI初始化
TWSR=0x00; // 0分频系数,预分频值1
TWBR=0x0c; // 4MHz CPU频率,100kHz的TWI速率
TWAR=0x01; // 主机,忽略高7位设置,不识别广播
TWCR=0x44; // 使能TWI,
DDRB = 0xff;
DDRD = 0xff;
PORTD = 0x00;
PORTB = 0x00;
PORTD = 0x00;
TwiStop();
for(;;)
{
buf[0]++;
//if(C24WriteByte(0,0x10)==TRUE)
//{
_delay_ms(20);
if(C24WriteByte(1,buf[0])==FALSE)
continue;
if(C24ReadByte(1,&tmp)==FALSE)
{
PORTB = 0x06;
continue;
}
break;
//}else{
//PORTD = tmp;
//TwiStop();
//}
}
for(;;)
{
PORTB = ~PINB|0x80;
PORTD = tmp;
}
return 0;
}
/*
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)
{
case TW_MT_DATA_ACK:
case TW_MR_SLA_NACK:
break;
case TW_MT_DATA_NACK:
TwiStop();
return FALSE;
default:
PORTB = 0x03;
PORTD = TWI_STATUS;
for(;;)
;
}
*dat = TWDR;
//TWCR = _BV(TWINT)|_BV(TWEN); // 发送NAK信号,表示是最后一个字节
TwiStop();
return TRUE;
}else{
return FALSE;
}
}else{
return FALSE;
}
return TRUE;
}
int main(void)
{
unsigned char tmp=0;
unsigned char buf[3]={0x10,0x11,0x12};
//TWI初始化
TWSR=0x00; // 0分频系数,预分频值1
TWBR=0x0c; // 4MHz CPU频率,100kHz的TWI速率
TWAR=0x01; // 主机,忽略高7位设置,不识别广播
TWCR=0x44; // 使能TWI,
DDRB = 0xff;
DDRD = 0xff;
PORTD = 0x00;
PORTB = 0x00;
PORTD = 0x00;
TwiStop();
for(;;)
{
buf[0]++;
//if(C24WriteByte(0,0x10)==TRUE)
//{
_delay_ms(20);
if(C24WriteByte(1,buf[0])==FALSE)
continue;
if(C24ReadByte(1,&tmp)==FALSE)
{
PORTB = 0x06;
continue;
}
break;
//}else{
//PORTD = tmp;
//TwiStop();
//}
}
for(;;)
{
PORTB = ~PINB|0x80;
PORTD = tmp;
}
return 0;
}
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |