|
使用的是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的寄存器配置好像都是一样的,设置的工作时钟也一样的,就是出错,不知道是什么问题,请马老师指教!非常感谢。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|