智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1137|回复: 3
打印 上一主题 下一主题

[软件类] XS128模拟IIC程序一直写不对,求大婶帮忙

[复制链接]

36

主题

167

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2525
威望
1270
贡献
709
兑换币
744
注册时间
2014-12-29
在线时间
273 小时
毕业学校
麻省理工学院
跳转到指定楼层
1#
发表于 2015-2-12 11:47:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
XS128模拟IIC程序一直写不对,求大婶帮忙
回复

使用道具 举报

2

主题

456

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3039

优秀会员奖章活跃会员奖章

威望
1604
贡献
885
兑换币
854
注册时间
2014-3-6
在线时间
275 小时
2#
发表于 2015-2-12 22:22:06 | 只看该作者
我也要
回复 支持 反对

使用道具 举报

1

主题

190

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6456

在线王奖章活跃会员奖章论坛元老奖章优秀会员奖章

QQ
威望
3092
贡献
1918
兑换币
1783
注册时间
2012-7-5
在线时间
723 小时
3#
发表于 2015-2-14 11:47:22 | 只看该作者
试了好几次都没成功,我放弃了
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

高级会员

Rank: 4

积分
570
威望
269
贡献
183
兑换币
166
注册时间
2015-1-4
在线时间
59 小时
4#
发表于 2015-4-8 14:35:08 | 只看该作者
void IIC_Init()
{
  DDRA=0XFF;
}

/**************************************
延时n微秒
**************************************/
void Delay5us(int c)
{
int cnt;
for(cnt=0;cnt<c;cnt++)
{
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;

_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;

_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;

_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
_asm NOP;_asm NOP;_asm NOP;
}

}
/**************************************
延时5毫秒
**************************************/
void Delay5ms(void)
{
   uint n;
   n = 560;
  while (n--);
  }

/**************************************
起始信号
**************************************/
void IIC_Start()
{
                        //拉高数据线
  
    SCL = 1;
    SDA = 1;                    //拉高时钟线
    Delay5us(5);                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us(5);                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us(2);                    
}
/**************************************
停止信号
**************************************/
void IIC_Stop()
{
                       //拉低数据线
    SCL = 1;
    SDA = 0;                     //拉高时钟线
    Delay5us(5);                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us(5);                 //延时
}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void IIC_SendACK(byte ack)
{
    SDA = ack;                  //写应答信号
    Delay5us(1);
    SCL = 1;                    //拉高时钟线
    Delay5us(5);                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us(2);                 //延时
}

/**************************************
接收应答信号
**************************************/
void IIC_RecvACK()
{
    Delay5us(3);
    SCL = 0;                    //拉高时钟线
    Delay5us(3);
    DDRA_DDRA0=0;                 //延时
    SDA=1;
    Delay5us(3);                   //读应答信号
    SCL = 1;                    //拉低时钟线
    Delay5us(5);                 //延时
    if(SDA==1)
      IIC_ERROR=1;
    else
      IIC_ERROR=0;
    SCL=0;
    Delay5us(3);
    DDRA_DDRA0=1;
      

}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void IIC_SendByte(uchar Data)
{
    uint i=8;
    uchar m=Data;
    uchar temp;
    for(i=8;i>0;i--)
    {
      temp=m&0x80;
      if(temp==0x80)
        SDA=1;
      else
        SDA=0;
      Delay5us(5);
      SCL=1;
      Delay5us(5);
      SCL=0;
      m=m<<1;
    }
}

/**************************************
从IIC总线接收一个字节数据
**************************************/
uchar IIC_RecvByte()
{
    int i;
    uchar j = 0;
    DDRA_DDRA0=0;
    SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=8; i>0; i--)         //8位计数器
    {
        SDA=1;
        Delay5us(3);
        SCL = 1;                //拉高时钟线
        Delay5us(5);
        if(SDA==1)             //延时
          j=j|0x01;
        else j=j;//读数据               
          SCL = 0;                //拉低时钟线
        if(i!=1)
         {
          j=j<<1;
         }
          //延时
    }
    DDRA_DDRA0=1;
    return j;
}

/*****************************************/
void i2c_write_reg(uint L3G4200_ADRESS,uint reg,uint Data)  //L3G4200 写寄存器
{
  
    IIC_Start();                  //起始信号
    IIC_SendByte(L3G4200_ADRESS);   //发送设备地址+写信号?
    IIC_RecvACK();
    IIC_SendByte(reg);    //内部寄存器地址
    IIC_RecvACK();
    IIC_SendByte(Data);       //内部寄存器数据
    IIC_RecvACK();
    IIC_Stop();                   //发送停止信号
}

uint i2c_read_reg(uint L3G4200_ADRESS ,uint reg)             //L3G4200 读寄存器
{   
     uchar BUF;
    IIC_Start();                          //起始信号
    IIC_SendByte(L3G4200_ADRESS);           //发送设备地址+写信号
    IIC_RecvACK();
    IIC_SendByte(reg);                   //发送存储单元地址,从0x01开始*************存在哪?       
    IIC_RecvACK();
    IIC_Start();                          //起始信号
    IIC_SendByte(L3G4200_ADRESS+1);         //发送设备地址+读信号
          IIC_RecvACK();

    BUF= IIC_RecvByte();          //BUF[0]存储0x32地址中的数据
    IIC_SendACK(1);
   
    IIC_Stop();                          //停止信号
    return BUF;
   
}





评分

1

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-14 05:26 , Processed in 0.047686 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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