智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1970|回复: 2
打印 上一主题 下一主题

xs128IIC功能函数哪里有问题啊,无法读取数据~

[复制链接]

2

主题

78

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2299
威望
1069
贡献
626
兑换币
703
注册时间
2014-12-30
在线时间
302 小时
毕业学校
武大
跳转到指定楼层
1#
发表于 2015-4-8 16:42:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30贡献
#include <hidef.h>
#include "MC9S12XS128.h"
#include "derivative.h"
#include "iic.h"

#define   uchar unsigned char
#define   uint unsigned int

uchar IIC_ERROR=0;/*应答标志位*/
// uint reg,Data;

#define SDA PORTA_PA6
#define SCL PORTA_PA7

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;
}

}
/**************************************
延时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(4);                 //延时
}

/**************************************
发送应答信号
入口参数: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_DDRA6=0;                 //延时
    SDA=1;
    Delay5us(3);                   //读应答信号
    SCL = 1;                    //拉低时钟线
    Delay5us(5);                 //延时
    if(SDA==1)
      IIC_ERROR=1;
    else
      IIC_ERROR=0;
    SCL=0;
    Delay5us(3);
    DDRA_DDRA6=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_DDRA6=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_DDRA6=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开始*************存在哪?

最佳答案

查看完整内容

程序本身没问题,检查下寄存器地址,寄存器地址可能有问题!
回复

使用道具 举报

3

主题

15

帖子

0

精华

高级会员

Rank: 4

积分
570
威望
269
贡献
183
兑换币
166
注册时间
2015-1-4
在线时间
59 小时
2#
发表于 2015-4-8 16:42:07 | 只看该作者
程序本身没问题,检查下寄存器地址,寄存器地址可能有问题!
回复

使用道具 举报

0

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
威望
125
贡献
76
兑换币
71
注册时间
2015-1-16
在线时间
21 小时
毕业学校
一中
3#
发表于 2016-1-7 21:16:41 | 只看该作者
IIC_ERROR后来用在哪了?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-6 00:48 , Processed in 0.051741 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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