搜索
bottom↓
回复: 2

AVR的TWI是不是一定要通过中断进行通信?

[复制链接]

出0入0汤圆

发表于 2012-6-15 19:29:48 | 显示全部楼层 |阅读模式
AVR的TWI是不是一定要通过中断进行通信?我没有用终端的时候一直接收不到应答位,求解答

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-6-15 21:55:25 | 显示全部楼层
TWI 就表用中断了,一个个字节去读

出0入0汤圆

发表于 2012-6-17 15:29:08 | 显示全部楼层
不是,可以用查询的。
你参考一下呢:
//TWI总线操作
//TWI总线上的主机发送Start或ReStart信号
#define TWI_Work_Start() (TWCR=(1<<TWINT)+(1<<TWSTA)+(1<<TWEN))
//TWI总线上的主机发送Stop信号
#define TWI_Work_Stop() (TWCR=(1<<TWINT)+(1<<TWSTO)+(1<<TWEN))
//TWI总线继续传输         
#define TWI_Work_Continue() (TWCR=(1<<TWINT)+(1<<TWEN))
//TWI总线继续传输,主机返回ACK信号   
#define TWI_Work_SentAck() (TWCR=(1<<TWINT)+(1<<TWEA)+(1<<TWEN))
//TWI总线继续传输,主机返回NotACK信号                     
#define TWI_Work_SentNotAck() (TWCR=(1<<TWINT)+(1<<TWEN))
//TWI总线上的主机发送字节数据
#define TWI_Work_WriteByte(byte_dat) {TWDR=(byte_dat);TWI_Work_Continue();}
//等待TWI总线完成当前工作
#define TWI_Work_Wait() {while(!(TWCR&(1<<TWINT)));}   
/*******************************************************************************
*作    者:电子信息工程技术教研室
*功    能:TWI总线初始化
*入口参数:无
*返 回 值:无
*说    明:1、fscl=fmcu/(16+2×TWBR×4的TWPS次方)
*             fscl=4M/(16+2×12×1)=4M/40=100k
*******************************************************************************/
void TWI_Hard_Init(void)
{
        //设置TWI比特寄存器TWBR
        TWBR=12;
        //设置TWI状态寄存器TWSR
        TWSR&=0xfc;
}
/*******************************************************************************
*作    者:电子信息工程技术教研室
*功    能:通过TWI总线向从机的内部地址写入数据
*入口参数:从机器件、从机的内部地址、数组、数量
*返 回 值:错误
*说    明:无
*******************************************************************************/
uchar TWI_MT_Write(uchar sla_adr,uint in_adr,uchar *shuzu_dat,uchar cnt_num)
{
        uchar sta_error=0,sla_temp,in_temp,cnt_temp;
        //根据从机器件选择从机地址
        switch(sla_adr)
        {
                //24C08存储阵列
                case(TWI_Sla_24C08L):
                {
                        sla_temp=TWI_Sla_24C08L+(in_adr>>7);
                        in_temp=(uchar)(in_adr-((in_adr>>8)<<8));
                }
                break;
                default:
                {
                }
                break;       
        }       
//TWI总线上的主机发送Start信号
TWI_Work_Start();
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:START已发送
if(TWSR&0xf8!=TWI_Status_Start) sta_error+=1;
//TWI总线上的主机发送字节数据,此处是Sla+W
TWI_Work_WriteByte(sla_temp);
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:MT模式下发送数据,接收到ACK
if(TWSR&0xf8!=TWI_Status_MTSlaACK) sta_error+=1;
//TWI总线上的主机发送字节数据,此处是内部地址
TWI_Work_WriteByte(in_temp);
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:MT模式下发送数据,接收到ACK
if(TWSR&0xf8!=TWI_Status_MTDataACK) sta_error+=1;
//写入数据
for(cnt_temp=0;cnt_temp<cnt_num;cnt_temp++)
{
  //TWI总线上的主机发送字节数据
  TWI_Work_WriteByte(*(shuzu_dat+cnt_temp));
  //等待TWI总线完成当前工作
  TWI_Work_Wait();
  //判断状态码:MT模式下发送数据,接收到ACK
  if(TWSR&0xf8!=TWI_Status_MTDataACK) sta_error+=1;
}
//TWI总线上的主机发送Stop信号
TWI_Work_Stop();
//返回错误状态
return sta_error;
}
/*******************************************************************************
*作    者:电子信息工程技术教研室
*功    能:通过TWI总线从从机的内部地址读出数据
*入口参数:从机器件、从机的内部地址、数组、数量
*返 回 值:错误
*说    明:无
*******************************************************************************/
uchar TWI_MR_Read(uchar sla_adr,uint in_adr,uchar *shuzu_dat,uchar cnt_num)
{
        uchar sta_error=0,sla_temp,in_temp,cnt_temp;
        //根据从机器件选择从机地址
        switch(sla_adr)
        {
                //24C08存储阵列
                case(TWI_Sla_24C08L):
                {
                        sla_temp=TWI_Sla_24C08L+(in_adr>>7);
                        in_temp=(uchar)(in_adr-((in_adr>>8)<<8));
                }
                break;
                default:
                {
                }
                break;       
        }       
//TWI总线上的主机发送Start信号
TWI_Work_Start();
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:START已发送
if(TWSR&0xf8!=TWI_Status_Start) sta_error+=1;
//TWI总线上的主机发送字节数据,此处是Sla+W
TWI_Work_WriteByte(sla_temp);
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:MT模式下发送数据,接收到ACK
if(TWSR&0xf8!=TWI_Status_MTSlaACK) sta_error+=1;
//TWI总线上的主机发送字节数据,此处是内部地址
TWI_Work_WriteByte(in_temp);
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:MT模式下发送数据,接收到ACK
if(TWSR&0xf8!=TWI_Status_MTDataACK) sta_error+=1;
//TWI总线上的主机发送ReStart信号
TWI_Work_Start();
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:ReSTART已发送
if(TWSR&0xf8!=TWI_Status_ReStart) sta_error+=1;
//TWI总线上的主机发送字节数据,此处是Sla+R
TWI_Work_WriteByte(sla_temp+1);
//等待TWI总线完成当前工作
TWI_Work_Wait();
//判断状态码:MR模式下发送Sla+R,接收到ACK
if(TWSR&0xf8!=TWI_Status_MRSlaACK) sta_error+=1;
//接收数据
if(cnt_num>1)
{
        for(cnt_temp=0;cnt_temp<(cnt_num-1);cnt_temp++)
        {  
                //TWI总线继续传输,主机返回ACK信号
   TWI_Work_SentAck();
   //等待TWI总线完成当前工作
   TWI_Work_Wait();  
   //判断状态码:MR模式下接收到数据,ACK已返回
   if(TWSR&0xf8!=TWI_Status_MRDataACK) sta_error+=1;
   *(shuzu_dat+cnt_temp)=TWDR;
        }
}               
//TWI总线继续传输,主机返回NotACK信号  
TWI_Work_SentNotAck();
//等待TWI总线完成当前工作
TWI_Work_Wait();  
//判断状态码:MR模式下接收到数据,NotACK已返回
if(TWSR&0xf8!=TWI_Status_MRDataNotACK) sta_error+=1;
*(shuzu_dat+cnt_num-1)=TWDR;  
//TWI总线上的主机发送Stop信号
TWI_Work_Stop();
//返回错误状态
return sta_error;
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 13:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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