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
 ), đà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:
 
	
	
	
		
 
software_i2c.c:
 
	
	
	
		
file project và mô phỏng
								đâ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);
 
#endifsoftware_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;
}
//---------------------------------------------------------Attachments
- 
		
			
		
		
		152.3 KB Views: 62
 
				 , con pic của em lỡ tèo chân RC4 nên đành ngậm ngùi chia tay i2c cứng
, con pic của em lỡ tèo chân RC4 nên đành ngậm ngùi chia tay i2c cứng