马老师,你好,请教一个MEGA64的问题?
使用的是AVR硬件TWI程序,在MEGA16上可以正常读写程序,在SCL时钟相同的条件下,在MEGA64上不能正常读写?TWI配置:
//配置I2C
SFIOR&=~BIT(PUD);
DDRD&=~(BIT(0)|BIT(1));
PORTD|=(BIT(0)|BIT(1));
TWI初始化:
void TWI_init(void)
{
TWCR = 0x00; //关闭TWI模块
TWAR = 0x00; //主机模式,该地址无效
TWBR = Baud_set; //25
TWSR = P_value; //1分频
TWCR= 0x04; //使能TWI,禁止中断
}
TWI读写:
/*********************************************
I2C总线写一个字节
返回0:写成功
返回1:写失败
**********************************************/
unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
{
Start(); //I2C启动
Wait();
if(TestAck()!=START)
{
findquestionG(); //错误指示,发现首次写入START,能都正常收到0X08,;第二次以后,写入start,返回0X08出错,返回1.
return 1; //ACK
}
Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
Twi();
Wait();
if(TestAck()!=MT_SLA_ACK)
{
findquestionB(); //错误指示,首次在发完写I2C从器件地址和写方式后,返回0X18出错,返回1。
return 1; //ACK
}
Write8Bit(RegAddress); //写器件相应寄存器地址
Twi();
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1; //ACK
Write8Bit(Wdata); //写数据到器件相应寄存器
Twi();
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1; //ACK
Stop(); //I2C停止
delay_nms(15); //延时
return 0;
}
/*********************************************
I2C总线读一个字节
返回0:读成功
返回1:读失败
**********************************************/
unsigned char I2C_Read(unsigned RegAddress)
{
unsigned char temp;
Start();//I2C启动
Wait();
if (TestAck()!=START)
return 1; //ACK
Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
Twi();
Wait();
if (TestAck()!=MT_SLA_ACK)
return 1; //ACK
Write8Bit(RegAddress); //写器件相应寄存器地址
Twi();
Wait();
if (TestAck()!=MT_DATA_ACK)
return 1;
Start(); //I2C重新启动
Wait();
if (TestAck()!=RE_START)
return 1;
Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式
Twi();
Wait();
if(TestAck()!=MR_SLA_ACK)
return 1; //ACK
Twi(); //启动主I2C读方式
Wait();
if(TestAck()!=MR_DATA_NOACK)
return 1; //ACK
temp=TWDR;//读取I2C接收数据
Stop();//I2C停止
delay_nms(1);
TWCR=0X80;////清除TWINT和禁止TWI(不加上这句程序只能读一次)
return temp;
}
同样的程序,在16上运行正常,看16和64的数据手册,关于TWI的寄存器配置好像都是一样的,设置的工作时钟也一样的,就是出错,不知道是什么问题,请马老师指教!非常感谢。 已解决。 一般是一个低级的错误,自己也不好意思说。既然到这里问,那么犯了什么错误为什么不告诉大家,让大家知道。只想获取,不想付出的人,在技术上不会有出息的。 马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的问题,所以想在论坛上面请教一下,确认16和64在TWI上没有什么区别,但是一直都没人恢复。我自己在论坛里面逛了很久,才初步确认程序上没问题,最后在硬件上找到是限流电阻使用偏大导致的。这个问题没必要特地来解释清楚吧?你这话说的严重了吧? 本帖最后由 guew 于 2013-4-18 12:05 编辑
as280711261 发表于 2013-4-18 10:23 static/image/common/back.gif
马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的 ...
大哥误会了,前思科首席技术官蒂姆说过,写技术笔记和文档是最好的学习方法。
如果你不介意,可以把问题刚产生时的现象,中间调试过程的思路,最后问题答案,以及答案所引出的进一步思考用文字记录下来,这个过程本身就是一种很好的自我提高方法。
心情好的话发到论坛,像我这样的后来者也可以学习学习,大伙讨论讨论,那就更好了。
这就是件两全其美的事了。
as280711261 发表于 2013-4-18 10:23 static/image/common/back.gif
马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的 ...
1 、这里是技术论坛,我不是什么公司的老板,也没有人知道你是谁,所以没有必要担心什么,你自己的技术机密自己不说谁也不知道。
2、实际上很多工程师认为软件很重要,其实硬件是基础,硬件和软件在嵌入式上是不分家的。有许多人碰到问题就到这里问,其实我也不能知道到底是哪里出了问题,没看到东西就知道什么地方错了,那是上帝。
3、之所以让大家把出现问题的地方,和解决问题的方法介绍一下,是为了大家能吸取经验。这也是技术的一部分。
4、实际上,你找的问题可能还不是关键点,能详细说明一下,可能会有朋友会给出更好的建议。你放弃了这个机会。 machao 发表于 2013-4-18 20:31 static/image/common/back.gif
1 、这里是技术论坛,我不是什么公司的老板,也没有人知道你是谁,所以没有必要担心什么,你自己的技术机 ...
马老师说的极是也,有些东西你说出来了,才能更好的进步。
页:
[1]