Thư viện I2C mềm cho PIC (đã test mạch thật OK)

xe đạp

Trứng gà
Sau mấy ngày hì hục ngâm cứu cái giao tiếp i2c, tiện thể cái chân i2c cứng của con PIC của mình bị hỏng (tiếc con PIC quá, bmt ko bán :(( ), đành ngồi tìm cách viết cái thư viện giao tiếp i2c mềm cho nó, cuối cùng thì trời không phụ lòng người. ưu điểm của nó là có thể dùng bất kỳ chân nào của pic để làm chân i2c. đã test trên mạch thật

đây là thư viện cho giao tiếp i2c mềm

software_i2c.h:

Code:
/**********************************************************
*    Software I2C for PIC16F887 in master mode
*
*    Compier:    HT PIC
*    Author:        Truong Cong Tri
***********************************************************
*    LIST FUNCTIONS
*
*    soft_i2c_start()    - issue start condition
*    soft_i2c_stop()        - issue stop condition
*    soft_i2c_write()    - send byte data
*    soft_i2c_read(ack)    - read byte data:    ack=0 -> NACK,    ack=1 -> ACK
*
*---------------------------------------------------------*/
 
#ifndef _SOFTWARE_I2C_H_
#define    _SOFTWARE_I2C_H_
 
//define IO pin for i2c communicate
#define    SCL_PIN        RC0
#define    SDA_PIN        RC1
 
#define    SCL_TRIS    TRISC0
#define    SDA_TRIS    TRISC1
 
void soft_i2c_start();
 
void soft_i2c_stop();
 
unsigned char soft_i2c_read(unsigned char ack);
        //ack = 1 -> send not ack signal (NACK)
        //ack = 0 -> send ack signal (ACK)
 
void soft_i2c_write(unsigned char data_send);
 
#endif

software_i2c.c:

Code:
/**********************************************************
*    Software I2C for PIC16F887 in master mode
*
*    Compier:    HT PIC
*    Author:        Truong Cong Tri
***********************************************************
*    LIST FUNCTIONS
*
*    soft_i2c_start()    - issue start condition
*    soft_i2c_stop()        - issue stop condition
*    soft_i2c_write()    - send byte data
*    soft_i2c_read(ack)    - read byte data:    ack=0 -> NACK,    ack=1 -> ACK
*
*---------------------------------------------------------*/
#include <pic.h>
#include "software_i2c.h"
 
 
//=========================================================
//    Soft I2C Start
//=========================================================
void soft_i2c_start()
{
    SDA_TRIS=0;
    SDA_TRIS=0;
 
    SDA_PIN=1;
    SCL_PIN=1;
    SDA_PIN=0;
    SCL_PIN=0;
}
//---------------------------------------------------------
 
 
//=========================================================
// Soft I2C Stop
//=========================================================
void soft_i2c_stop()
{
    SDA_TRIS=0;
    SCL_TRIS=0;
 
    SDA_PIN=0;
    SCL_PIN=1;
    SDA_PIN=1;
}
//---------------------------------------------------------
 
 
//=========================================================
//    I2C write
//=========================================================
void soft_i2c_write(unsigned char data_send)
{
    unsigned char i;
 
    SDA_TRIS=0;
    SCL_TRIS=0;
 
    for(i=0;i<=8;i++)
    {
        if(data_send & 0x80)    // MSB fist -> LSB last
            SDA_PIN=1;
        else
            SDA_PIN=0;
 
        SCL_PIN=1;
        data_send <<=1;
        SCL_PIN=0;
    }
}         
//---------------------------------------------------------
 
 
//=========================================================
//    Soft I2C read
//=========================================================
unsigned char soft_i2c_read(unsigned char ack)
{
    unsigned char get_data,i;
 
    SCL_PIN=0; 
    SDA_TRIS=1;        //set SDA_PIN as input
 
    for(i=0;i<8;i++)
    {
        get_data<<=1;
        SCL_PIN=1;
 
        if(SDA_PIN)
            get_data |=1;
 
        SCL_PIN=0;
    }
 
    SDA_TRIS=0;        //set SDA_PIN as output
    if(ack)
        SDA_PIN=1;    //ack=1 -> send not ack signal (NACK)
    else
        SDA_PIN=0;    //ack=0 -> send ack signal (ACK)
 
    SCL_PIN=1;
    SCL_PIN=0;
 
    return get_data;
}
//---------------------------------------------------------
file project và mô phỏng
 

Attachments

Manhdd

Cố Vấn CLB
Staff member
Cái này có tính học thuật cao :d. Nhưng chắc hiếm có bạn xài, trừ trường hợp bất khả kháng :-p
 

xe đạp

Trứng gà
em thấy cái này nếu dùng con pic nào ko có i2c cũng có thể dùng mà, hoặc nếu vì lí do gì đó mà 2 chân i2c cứng của pic bị xài mất thì có thể xài 2 chân khác, cách dùng thì tương tự như thư viện i2c của diễn đàn :D, con pic của em lỡ tèo chân RC4 nên đành ngậm ngùi chia tay i2c cứng
 

t10000

Trứng gà
cái luồng này lâu rồi, nhưng tôi tình cờ ghé qua,
vấn đề là dùng 887 thì tôi thấy không cần viết lại hàm riêng, chỉ cần khai báo lại PIN SCL và SDA là được,
tôi thử code này trên PIC 16F628A hoặc 16F88 thì đều không chạy.
Bạn Trí test lại hộ xem phải vây không hay là tại tôi làm phần cứng có vấn đề
 
Top