CC2541 IIC

来源:互联网 发布:积分系统数据库设计 编辑:程序博客网 时间:2024/06/03 03:49

现在很多人做手环,用加速剂最常见的就是MPU6050,MPU6050是IIC接口的。而CC2541 HAL没有提供IIC驱动,下面这个模拟的仅供参考。

#include <ioCC2540.h>#define  uchar unsigned  char #define  uint  unsigned  int#define SCL P1_5                //定义模拟IIC的时钟线#define SDA P1_6                //定义模拟IIC的数据线void IIC_Init(void)//IIC初始化{    P1DIR |= 0x60;      //P1.5、P1.6定义为输出    SDA = 1;    delay_1ms();    SCL = 1;    delay_1ms();}void Signal_Start(void)//IIC起始信号{    P1DIR |= 0x60;      //P1.5、P1.6定义为输出    SDA = 1;    delay_1ms();    SCL = 1;    delay_1ms();    SDA = 0;    delay_1ms(); }void Signal_Stop(void)//IIC停止信号{    P1DIR |= 0x60;      //P1.5、P1.6定义为输出    SDA = 0;    delay_1ms();    SCL = 1;    delay_1ms();    SDA = 1;    delay_1ms(); }void Respons(void)//答应信号{    uint i = 0;    P1DIR |= 0x20;      //P1.5定义为输出    P1DIR &= ~0x40;      //P1.6定义为输入    SCL = 1;    delay_1ms();    SCL = 0;    delay_1ms();        if(i>=300)    {      delay_1ms();    }}void Write_Byte(uchar wdata){    uchar i,mdata;    P1DIR |= 0x60;      //P1.5、P1.6定义为输出    mdata = wdata;    for(i=0;i<8;i++)    {                SCL = 0;        delay_1ms();        if(mdata & 0x80)        {          SDA = 1;        }        else        {          SDA = 0;        }        delay_1ms();        SCL = 1;        delay_1ms();          mdata <<= 1;    }    SCL = 0;    delay_1ms();    SCL = 1;    delay_1ms();}uchar Read_Byte(){    uchar i,rdata = 0;    P1DIR |= 0x20;      //P1.5定义为输出    P1DIR &= ~0x40;      //P1.6定义为输入    SCL = 0;    delay_1ms();    SCL = 1;    for(i=0;i<8;i++)    {        SCL = 1;        delay_1ms();        rdata = (rdata<<1)|SDA;        SCL = 0;        delay_1ms();    }    return rdata;}void Write_Add(uchar add,uchar wdata,uchar comd){    Signal_Start(); //产生一个起始信号    Write_Byte(comd);    Respons();      //等待答应    Write_Byte(add);    Respons();      //等待答应    Write_Byte(wdata);    Respons();      //等待答应    Signal_Stop();  //产生一个终止信号}uchar Read_Add(uchar add,uchar comd){    uchar tdata;    Signal_Start();     //产生一个起始信号    Write_Byte(comd);    Respons();          //等待答应    Write_Byte(add);    Respons();          //等待答应    Signal_Start();     //再产生一个起始信号    Write_Byte(comd|0x01);    Respons();          //等待答应    tdata = Read_Byte();    Signal_Stop();      //产生一个终止信号    return tdata;       }void delay_1ms(void)    //  延时1ms{    uchar a,c;        for(c=4;c>0;c--)    {        //for(b=142;b>0;b--)        {            for(a=2;a>0;a--)            {            }        }    }}


原创粉丝点击