共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 |