搜索
bottom↓
回复: 3

求助马老师帮助。用ATmage16进行双机TWI通讯时,怎么也调不好

[复制链接]

出0入0汤圆

发表于 2013-10-26 23:29:42 | 显示全部楼层 |阅读模式
我用两个ATmage16进行简单的双机TWI通讯时,一个发送,一个接收显示。但数据传送不正常,怎么也调不好。苦恼。
在不接从机SDA线时,产生非应答时地址和数据之间有一个尖脉冲,不知什么原因,如何解决?非常期盼您的解答。


在接上从机SDA线时,产生应答时这个尖脉冲又到了数据应答和停止位之间,不知为什么,如何解决?非常期盼您的解答。


主发的代码如下:
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char

#define START         0x08//启动响应状态码
#define RE_START      0x10//重启启动响应状态码
#define MT_SLA_ACK    0x18//MT模式地址响应状态码
#define MT_DATA_ACK   0x28//MT模式数据响应状态码
#define MR_SLA_ACK    0x40//MR模式地址响应状态码
#define MR_DATA_NOACK 0x58//MR模式数据无响应状态码
#define MR_DATA_ACK   0x50//MR模式数据响应状态码

#define start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))//小括号内赋值
#define stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define wait() {while(!(TWCR&(1<<TWINT)))};//花括号内定义语句
#define testack() (TWSR&0xf8)
#define setack() (TWCR|=(1<<TWEA)
#define sentnoack() (TWCR&=~(1<<TWEN))
#define writebyte(x) {TWDR=(x); TWCR=(1<<TWINT)|(1<<TWEN); }

#define TWI_addr 0x78
uchar array[]= { 0xC0, 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };  //段码表

uchar iicwrite(uchar wdata ,uchar address)// TWI发送
{
uchar a;
a=0;
TWBR=100;
//TWSR|=0x03;
start();
wait();
if(TWSR&0xf8!=START)//响应码等于0x08继续
a= 1;//错误返回,判断错误为1
/*
writebyte(TWI_addr)//发送芯片地址加写,我们定义了0x28为芯片地址
wait();//等待
if(TWSR&0xf8!=MT_SLA_ACK)//状态码等于0x18继续
a=2;//错误返回,判断错误为2
  */
writebyte(address);//写入数据绝对地址

wait();//等待------次处在图上产生一个脉冲,怎样消除?

if(TWSR&0xf8!=MT_DATA_ACK)//状态码等于0x28继续
a=3;//错误返回,判断错误为3

writebyte(wdata);//发送要写入的数据
wait();//等待
if(TWSR&0xf8!=MT_DATA_ACK)//状态码等于0x28继续
a=4;//错误返回,判断错误为4

stop();
return a;
}

void delay_us()
{
int us;
us=0;
while(us<100)
us++;

}

void delay_ms(uint ms)
{
uint i,k;
for(i=0;i<ms;i++)
    for(k=0;k<1141;k++);

}

void init()//8位LED端口设定,及TWI端口设定
{
  DDRD=0xff;
  PORTD=0xff;
  DDRC=0xff;

}

void show(uchar data)//数码管显示数组值
{

DDRA=0xff;
PORTA=~BIT(0);
DDRB=0xff;
PORTB=data;

}


void main()
{
  uchar i,k,j;
  i=0x78;
  init();
while(1)
   {
      for(k=0;k<9;k++)
         {
          j=array[k];

          PORTD=j; //8位LED显示数组值
          show(j); //数码管显示数组值
          iicwrite(j,i);//TWI发送数组值

          delay_ms(500);
         }

    }

  }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2013-10-28 15:08:26 | 显示全部楼层
按照博客园BitArt的建议一步一步的调试查看TWSR的状态,终于调好了,今天太高兴了。

出0入0汤圆

发表于 2013-11-1 15:22:18 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2013-11-6 22:14:48 来自手机 | 显示全部楼层
最近也在研究这个  
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 23:45

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

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