OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6089|回复: 2

用AVR的TWI读写AT24C02的问题,太奇怪了

[复制链接]

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-3-16
在线时间
4 小时
发表于 2014-4-24 18:00:46 | 显示全部楼层 |阅读模式

这是程序的main函数
 int main(void)
{
    uint8_t temp=5;
    Init_IIC();
// IIC_Read(0xA1,2,sizeof(uint8_t),1,&temp);
    temp++;
    IIC_Write(0xA0,2,sizeof(uint8_t),1,&temp);
    while(1)
    {
        display(temp);               //数码管显示
    }
}

把这一个读的函数注释掉能正常显示,但如果不注释的话不能显示;
我以为是读函数的问题,
但我要是吧写的那个注释掉,读的那个不注释,又能正常显示了 
TWI读写函数完整是这样的

unsigned char IIC_Read(unsigned char device_addr,unsigned char word_addr,unsigned char type_size,unsigned char len,void *user_buf)
{

    //Start
        IIC_Start();                       //硬件发送START信号,并且清零TWINT位,使能硬件IIC,使IIC开始工作
    IIC_Wait();                          //等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != TW_START) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0

//SLA+W
TWDR = device_addr&0xFE ;          //芯片地址,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_SLA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0

//WORD ADDRESS
TWDR = word_addr;                         //将写入数据的绝对地址 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


//REPEATED START
IIC_Start();                         //硬件发送START信号,并且清零TWINT位,使能硬件IIC,使IIC开始工作
IIC_Wait();                          //等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != TW_REP_START ) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0

//SLA+R
TWDR = device_addr| 0x01;          //芯片地址,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MR_SLA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0

//Read Data

len = len*type_size;
while(len--)
{
if(len == 1)
{
TWCR = (1 << TWINT) | (1 << TWEN);   //不使能应答

}
else
{
TWCR = (1 << TWINT) | (1 << TWEN)| (1 << TWEA);   //使能应答
}
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MR_DATA_ACK) return 0; //检测到TWINT位置

*(unsigned char*)user_buf++=TWDR;
}

IIC_Stop();
IIC_Stop();                          //数据传输完成,发送STOP信号,释放对总线的控制
return 1;                            //写入数据成功 ,返回1 ,用来判断是否成功写入数据  

}



unsigned char IIC_Write(unsigned char device_addr,unsigned char word_addr,unsigned char type_size,unsigned char len,void *user_buf)
{
// unsigned char *p=(unsigned char *)user_buf;
//Start
IIC_Start();                         //硬件发送START信号,并且清零TWINT位,使能硬件IIC,使IIC开始工作
IIC_Wait();                          //等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != TW_START) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0

//SLA+W
TWDR = device_addr&0xFE ;          //芯片地址,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_SLA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0

//WORD ADDRESS
TWDR = word_addr;                         //将写入数据的绝对地址 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


len = len*type_size;
while(len--)
{

TWDR = *(unsigned char *)user_buf++;           //将要写入的数据 ,赋值给数据寄存器 TWDR ,等待发送

TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能IIC硬件接口 ,让IIC进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != TW_MT_DATA_ACK)return 0;

}
//*/
IIC_Stop();                          //数据传输完成,发送STOP信号,释放对总线的控制
return 1;                            //写入数据成功 ,返回1 ,用来判断是否成功写入数据  

}

回复

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165778
金钱
165778
注册时间
2010-12-1
在线时间
2124 小时
发表于 2014-4-24 23:31:17 | 显示全部楼层
好奇怪啊....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-3-16
在线时间
4 小时
 楼主| 发表于 2014-4-25 13:24:53 | 显示全部楼层
有没有好用的AVR16的程序参考一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-6-20 00:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表