永发信息网

关于AVR的模拟I2C程序

答案:1  悬赏:0  手机版
解决时间 2021-03-09 09:54
  • 提问者网友:你给我的爱
  • 2021-03-08 13:53
我移植了一个确实可用的51单片机模拟I2C程序到AVR单片机(mega16)上,但是移植后无法使用,我已经多次尝试但依旧无法找到原因,忘各位大神帮我看看,指点迷津。

#include
#include

#define set_sda PORTC |= 0x01
#define clr_sda PORTC &= ~(0x01)
#define set_scl PORTC |= (1<<1)
#define clr_scl PORTC &= ~(1<<1)
#define read_sda (PORTC & (0x01))
#define out_sda DDRC |= 0x01
#define in_sda DDRC &= ~(0x01)

#define IC_WRITE (0x1D << 1)
#define IIIC_READ ((0x1D << 1) | 0x01)

uchar table1[16]=" LCSOFT X= 0.00";//1602显示数据
uchar table2[16]=" Y= 0.00 Z= 0.00";
uchar table3[16]="No acceleration!";
uchar table4[10]="0123456789";
uchar table5[8] =" MMA7455";
uchar table7[16]="Value: X=0.50 ";



void iic_start() //函数功能:I2C通信开始
{
set_scl;
_delay_us(30);
set_sda;
_delay_us(30);
set_scl;
_delay_us(30);
clr_sda;
_delay_us(30);
set_scl;
_delay_us(30);
}
void iic_stop() //函数功能:I2C通信停止
{
clr_sda;
_delay_us(30);
set_scl;
_delay_us(30);
set_sda;
_delay_us(30);
set_scl;
_delay_us(30);
}
void iic_ack() //函数功能:I2C通信查应答位
{
// set_sda;
set_scl;
_delay_us(30);
clr_scl;
_delay_us(30);
}
void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节
{
uchar i,temp,temp1;
temp1=wdata;
for(i=0;i<8;i++)
{
clr_scl;
_delay_us(30);
temp=temp1;
temp=temp&0x80;
if(temp==0x80)
set_sda;
else
clr_sda;
_delay_us(30);
set_scl;
_delay_us(30);
clr_scl;
_delay_us(30);
temp1=temp1<<1;
}
}
char iic_read_byte(void)//函数功能:从I2C从机中读出一个字节
{
uchar x;
char data = 0;
in_sda;
_delay_us(30);
set_sda;
_delay_us(30);
for(x=0;x<8;x++)
{
data = data << 1;
_delay_us(30);
clr_scl;
_delay_us(30);
set_scl;
_delay_us(30);
if(read_sda)
data |= 0x01;
//else
// data&=0xfe;
}
out_sda;
return data;
}
void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
{
uchar t;
t=(IIC_WRITE<<1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
iic_write_byte(wdata);
iic_ack();
iic_stop();
}
char iic_read(uchar byte_add)//函数功能:按地址读出一字节数据
{
uchar t;
char x;
t=(IIC_WRITE<<1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
t=((IIC_READ<<1)|0x01);
iic_start();
iic_write_byte(t);
iic_ack();
x=iic_read_byte();
iic_ack();
iic_stop();
return x;
}

修改一下,宏定义
#define IC_WRITE (0x1D << 1)
#define IIIC_READ ((0x1D << 1) | 0x01)
改为
#define IC_WRITE 0x1D << 1
#define IIIC_READ 0x1D << 1

之前改了忘记改回来。
最佳答案
  • 五星知识达人网友:酒醒三更
  • 2021-03-08 15:25
#define IIIC_READ 0x1D << 1这个有问题的,读数据的时候最低位要求为1,读写控制I2C器件可以用纬图的Ginkgo USB转I2C适配器。很好用的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯