#两个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;
}}
}
调试没有反应,求指点啊 |