I2C总线驱动代码

来源:互联网 发布:js金额大小写转换函数 编辑:程序博客网 时间:2024/06/05 16:21

通过上篇对I2C总线的介绍,那面,接下来就需要软件部分针对I2C总线的编程实现。


具体细细道来,(前提是,已经找好两个IO口分别为SDA SCL)

1.1st function: I2c start

void IIC_Start(void){    SDA_OUTPUT();    SET_SDA();    usleep(4);    SET_SCL();    usleep(6);    CLR_SDA();              usleep(4); }
2. 2nd :I2c stop

void IIC_Stop (void){    usleep(4);    CLR_SCL();    usleep(4);    SDA_OUTPUT();    usleep(4);    CLR_SDA();    usleep(4);    SET_SCL();    usleep(4);    SET_SDA();    usleep(4);}


3. 3rd:ACK

void I2C_ACK(uint8_t ack){    CLR_SCL();    SDA_OUTPUT();usleep(2); if (ack){SET_SDA();}else{CLR_SDA();}usleep(2);     SET_SCL();usleep(4);     CLR_SCL();usleep(4); }

4. 4th :send one byte

void IIC_Byte_send (unsigned char data){    int j;    for ( j = 0; j < 8; j++ )    {usleep(4); CLR_SCL();usleep(2);        if ( data & 0x80 )  SET_SDA();        else  CLR_SDA();        data <<= 1;        usleep(2);        SET_SCL();            }usleep(4);}

5. 5th: receive one byte

void IIC_Byte_receive (unsigned char *data){    int j;    unsigned char tmp=0x00;CLR_SCL();    for( j = 0 ; j < 0x08 ; j++)    {    tmp <<=1;        usleep(4);        SET_SCL();        usleep(2);        if (TST_SDA())  tmp += 1;        usleep(2);        CLR_SCL();    }usleep(4);          *data = tmp;}
6. 6th:send byte and wait ACK

int I2C_Send_data_Wait_ack(unsigned char data){    IIC_Byte_send(data); //IIC send one byte    CLR_SCL();              // high clock cycle    SDA_INPUT();    usleep(4);    SET_SCL();    usleep(4);    if (0x00 == TST_SDA() )                 //ACK    {         usleep(4);        CLR_SCL();        usleep(4);        SDA_OUTPUT();          SET_SDA();                 usleep(4);     }    else    {                  IIC_Stop();//NoACK        SET_SCL();        return(0);    }    return(1);}


构建完这6个函数,I2C驱动还有什么理由通信不了呢?


当然了,大神们可能各有各的办法。小弟这里也只是抛砖引玉罢了。。。。。



1 1
原创粉丝点击