CC2541 软件I2C

来源:互联网 发布:大数据设计哪些技术 编辑:程序博客网 时间:2024/06/05 16:50

在CC2541上硬件I2C不是很稳定,因此写了个软件I2C例程

宏定义软件I2C中I\O及操作

#define SCL                             P1_5                //定义模拟IIC的时钟线#define SDA                             P1_6                //定义模拟IIC的数据线#define SDA_0                           (P1_6=0) //SDA=0#define SDA_1                           (P1_6=1)  //SDA=1#define SCL_0                           (P1_5=0) //SCL=0#define SCL_1                           (P1_5=1)  //SCL=1#define SDA_IN                          P1DIR &= ~BIT6 //SDA INPUT#define SDA_OUT                         P1DIR |= BIT6  //SDA OUTPUT#define SCL_IN                          P1DIR &= ~BIT5 //SCL INPUT#define SCL_OUT                         P1DIR |= BIT5  //SCL OUTPUT#define I2C_SDA_READ                    (P1 & BIT6)

I2C间断延时函数

void delay_1ms(void)    //误差 0us  延时1ms{    uint8 a,c;        for(c=4;c>0;c--)    {        //for(b=142;b>0;b--)        {            for(a=2;a>0;a--)            {            }        }    }}

I2C初始化函数

void IIC_Init(void)//IIC初始化{    P1DIR |= 0x60;      //P1.5、P1.6定义为输出    SDA_0;    SCL_0;    delay_1ms();    SCL_1;    SDA_1;    delay_1ms();}

I2C起始信号

/* * 启动iic *///  static void start(void) {void start(void){    SDA_OUT;    //开路输出,并输出0.        SCL_OUT;    SDA_1;  //SDA = 1;    SCL_1;  //SCL = 1;    delay_1ms();    SDA_0;  //SDA = 0;    delay_1ms();    SCL_0;  //SCL = 0;  //START}

I2C停止信号

/* *停止iic */void stop(void){    SDA_OUT;    //开路输出,并输出0.    SCL_0;  //SCL = 0;    delay_1ms();    SCL_1;  //SCL = 1;  STOP    delay_1ms();    SDA_1;  //SDA = 1;        SDA_IN;        SCL_IN;}

I2C主机发送无应答信号

//***********************************************************************************//*名称:i2c_send_noack()                                                              *//*功能:无应答I2C总线                                                              *//*参数:无                                                                         *//*返回:1 有NOACK信号 0 无NOACK信号                                                 *//***********************************************************************************void send_noack(void){    SDA_OUT;    //开路输出,    SDA_1;  //SDA = 1; NO ACK    delay_1ms();    SCL_1;  //SCL = 1;    delay_1ms();    SCL_0;  //SCL = 0;  //START}

I2C主机发送应答信号

// iic 应答  for slavervoid send_ack(void) {    SDA_OUT;    //开路输出,    SDA_0; //OUT 0 ACK    delay_1ms();    SCL_1;    delay_1ms();    SCL_0;}

I2C检测从机应带信号

uint8 check_ack(void) {    uint8 ack_flag;    SDA_IN; //开路输入,    delay_1ms();    SCL_1;  //read ask begin    delay_1ms();        if(I2C_SDA_READ == BIT6){ //if (SDA==1)        ack_flag = 0; //1: err    }else{        ack_flag = 1; //0: ok    }    SCL_0;  //read ask end    return ack_flag;}

I2C读一个字节

/* * iic读一个字节 */uint8 iic_read(void) {    uint8 j, dat = 0;    SDA_IN; //开路输入,    for (j = 0; j < 8; j++) {        SCL_1;  //read TDOS_SDA begin. delay 0.7us        dat <<= 1;                delay_1ms();                delay_1ms();                if(I2C_SDA_READ == BIT6){ //if (SDA==1)            dat |= 0x01; //input TDOS_SDA        }        SCL_0;  //read TDOS_SDA end. delay 1.4us    }    return dat;}

I2C写一个字节

/* * iic写一个字节 */void iic_write(uint8 datIn) {    uint8 dat, j;    dat = datIn;        SDA_OUT;        SCL_0;    for (j = 0; j < 8; j++) {            if((dat & 0x80)) SDA_1;            else SDA_0;            delay_1ms();            delay_1ms();            SCL_1;  //write TDOS_SDA begin            delay_1ms();            dat <<= 1;            SCL_0;  //write TDOS_SDA end            delay_1ms();    }}

头文件函数声明

void delay_1ms(void);void IIC_Init(void);void stop(void);void start(void);void send_noack(void);void send_ack(void);void iic_write(uint8 datIn);uint8 check_ack(void);uint8 iic_read(void);

GitHub工程源代码:

https://github.com/lanhaixuan/CC2541_VL6180X_BMA250