金牌会员
- 积分
- 2299
- 威望
- 1069
- 贡献
- 626
- 兑换币
- 703
- 注册时间
- 2014-12-30
- 在线时间
- 302 小时
- 毕业学校
- 武大
|
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开始*************存在哪? |
最佳答案
查看完整内容
程序本身没问题,检查下寄存器地址,寄存器地址可能有问题!
|