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:
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);
#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;
}
//---------------------------------------------------------
Attachments
-
152.3 KB Views: 62