打印
[AVR单片机]

跪求指点mega16IIC程序

[复制链接]
1626|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kbdespotw|  楼主 | 2013-3-21 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#两个MEGA16之间IIC通信#
#以下是发送#
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
#define IIC_Start()          TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
#define IIC_Stop()          TWCR =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
#define IIC_Wait()           while(!(TWCR&(1<<TWINT)))
void delay(uint t)
{
uint x,y;
for(x=0;x<t;x++)
   for(y=0;y<114;y++);
}
void twi_init()
{TWBR=0X20;//设置频率
TWCR=0x44;
}
void test()
{
DDRB=0XFF;
PORTB=0X00;
}
void test1()
{
DDRA=0XFF;
PORTA=0X00;
}
unsigned char twi_write(unsigned char dd)
{
IIC_Start();                         //硬件发送START信号,并且清零TWINT位,使能硬件TWI,使TWI开始工作
IIC_Wait();                          //等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != 0x08) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0            
test();
TWDR = 0xa2 ;          //芯片地址 0xA0 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x18) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
test1();            
TWDR = dd;                           //将要写入的数据 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);   //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();                          //等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x28) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
      
IIC_Stop();                          //数据传输完成,发送STOP信号,释放对总线的控制
return 1;                            //写入数据成功 ,返回1 ,用来判断是否成功写入数据
      
}
void main()
{
DDRA=0XFF;
PORTA=0XFF;
DDRB=0XFF;
PORTB=0XFF;
while(1)
{
twi_init();
twi_write('1');
}
}
#以下是接受#
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
#define IIC_Start()          TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
#define IIC_Stop()          TWCR =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
#define IIC_Wait()           while(!(TWCR&(1<<TWINT)))
#define IIC_NoneAck()   TWCR =(1<<TWINT)|(1<<TWEN)
uchar data;
void delay(uint t)
{
uint x,y;
for(x=0;x<t;x++)
   for(y=0;y<114;y++);
}      

main()
{
DDRB=0XFF;
PORTB=0Xff;
while(1){
TWAR=0XA2;
TWCR=0X44;

if((TWSR&0xf8)!=0x68)
return 0;
else
{data=TWDR;
DDRB=0XFF;
PORTB=0X00;


}}

}
调试没有反应,求指点啊

相关帖子

沙发
dqyubsh| | 2013-3-21 21:06 | 只看该作者
这个官网上有现成的,用不着自己弄。或者去下载一个AVRLIB,也是现成的。

使用特权

评论回复
板凳
qin552011373| | 2013-3-21 21:51 | 只看该作者
你把你的数据接手之后用串口传到电脑上看看

使用特权

评论回复
地板
yhhsky| | 2013-3-30 18:57 | 只看该作者

使用特权

评论回复
5
飞云| | 2013-4-20 14:46 | 只看该作者
这个iic需要参考手册上的说明编写,我用中断编写过和用模拟iic编写差不多要按照iic协议。
给你我的代码参考下吧。
















使用特权

评论回复
6
蝴蝶效应019| | 2013-4-23 09:11 | 只看该作者

使用特权

评论回复
7
qin552011373| | 2013-4-23 23:11 | 只看该作者
蝴蝶效应019 发表于 2013-4-23 09:11

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝