有谁用过MPU-6050角度传感器,求教
现在正在弄MPU-6050角度传感器,求质料和430的程序 求不到的,只有自己找前辈写的一些程序自己再改 ppocat_check 发表于 2013-5-3 20:53 static/image/common/back.gif求不到的,只有自己找前辈写的一些程序自己再改
这两天用模拟的I2C写,应为430的IO口没有双工模式,写不了,现在正在用硬件I2C写 430用IIC读数据的时候 SDA改成DIR_IN 就可以了- - ...... sxliujin 发表于 2013-5-25 23:38 static/image/common/back.gif
430用IIC读数据的时候 SDA改成DIR_IN 就可以了- - ......
我是用的模拟I2C写的 #include "i2c.h"
#include"mpu6050.h"
unsigned char CY=0;
void Delay5us()
{
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
_NOP(); _NOP();_NOP(); _NOP();_NOP();
}
//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{
SET_SDA; //拉高数据线
SET_SCL; //拉高时钟线
Delay5us(); //延时
RESET_SDA; //产生下降沿
Delay5us(); //延时
RESET_SCL; //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
RESET_SDA; //拉低数据线
SET_SCL; //拉高时钟线
Delay5us(); //延时
SET_SDA; //产生上升沿
Delay5us(); //延时
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
//(51单片机)
/********************************
void I2C_SendACK(bit ack)
{
SDA = ack; //写应答信号
SET_SCL; //拉高时钟线
Delay5us(); //延时
RESET_SCL; //拉低时钟线
Delay5us(); //延时
}
*********************************/
//(430单片机)
void I2C_SendACK(uchar ack)
{
if(ack) SET_SDA;
else RESET_SDA ; //写应答信号
SET_SCL; //拉高时钟线
Delay5us(); //延时
RESET_SCL; //拉低时钟线
Delay5us(); //延时
}
//**************************************
//I2C接收应答信号
//**************************************
uchar I2C_RecvACK()
{
P1DIR &=0xef; //SDA输入
SET_SCL; //拉高时钟线
Delay5us(); //延时
CY = P1IN&0x10; //读应答信号
RESET_SCL; //拉低时钟线
Delay5us(); //延时
P1DIR |=0x10; //SDA输出
return CY;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
//(51单片机)
//dat <<= 1; //移出数据的最高位
// SDA = CY; //送数据口
/*******************************/
// (430单片机)
CY=dat&0x80;
if(CY==0) RESET_SDA;
elseSET_SDA;
dat <<= 1;//移出数据的最高位
/*******************************/
SET_SCL; //拉高时钟线
Delay5us(); //延时
RESET_SCL; //拉低时钟线
Delay5us(); //延时
}
I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0;
P1DIR &=0xef; //SDA输入
SET_SDA;//使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SET_SCL; //拉高时钟线
Delay5us(); //延时
dat |= ((P1IN &0x10)>>4); //读数据
RESET_SCL; //拉低时钟线
Delay5us(); //延时
}
P1DIR |=0x10; //SDA输出
return dat;
}
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //内部寄存器地址,
I2C_SendByte(REG_data); //内部寄存器数据,
I2C_Stop(); //发送停止信号
}
//**************************************
//从I2C设备读取一个字节数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{
uchar REG_data;
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //发送存储单元地址,从0开始
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress+1);//发送设备地址+读信号
REG_data=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(1); //接收应答信号
I2C_Stop(); //停止信号
return REG_data;
}
资料可以去智能小车相关的论坛搜搜,很多。
I2C建议参考一下白沙怀表的程序,里面有模拟的I2C程序。
附件是我找的读写AT24c02的硬件I2C程序,
页:
[1]