Mình đang viết code cho PIC16F887 giao tiếp với DS1307 , nhưng không hiểu xao mình không thấy quá trình giao tiếp thành công ???
đây là code của mình,các bác xem hộ mình cái :
test của mình là thử ghi giá trị vào thanh ghi 0x07 rồi đọc lại, nhưng đọc rồi xuất ra port thì thấy không được ? chả biết có ghi được không
mạch mô phỏng đây :
I2C_RTC_DS1307.X.7z
thank
đây là code của mình,các bác xem hộ mình cái :
Code:
// khai bao bo tien xu ly
#include "htc.h"
#include <pic.h>
// cau hinh ngoai vi xu dung cho PIC
__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON&MCLRE_ON&CP_OFF&CPD_OFF&BOREN_OFF&IESO_OFF&FCMEN_OFF&LVP_OFF&DEBUG_OFF);
__CONFIG(BOR4V_BOR40V&WRT_OFF);
// khai bao mot so bien toan cuc
#define led RE0
/*********************************************************************************************
*********************************************************************************************
***************** cac chuong trinh con bat dau tu day *************************
***************** *************************
*********************************************************************************************/
// chuong trinh con cau hinh cho pic
void config(void)
{
// cau hinh cho port
ANSEL = ANSELH = 0x00; // dat tat ca cac PIN lam PIN vao ra so
TRISA = TRISB = TRISC = TRISD = TRISE =0x00; // dat tat ca cac pin deu la dau ra so
PORTA = PORTB = PORTC = PORTD = PORTE = 0x00; // xoa xuong muc 0
// cau hinh cho ngat time0
GIE = 1; // cho phep ngat toan cuc
PEIE = 1; // cho phep ngat ngoai vi
T0IE = 1; // cho phep ngat time0
T0IF = 0; // xoa co ngat
T0CS = 0; // xung clock la xung noi
T0SE = 0; // chon xuon tang la tu thap len cao
PSA = 0; // prescale la cung cap cho time0
TMR0 = -200;
PS2 = PS1 = PS0 = 1; // chon ty so chia tan la 1:256
// cau hinh cho khoi MSSP hoat dong o che do I2C master
SSPEN = 1; // cau hinh cho 2 chan SCL va SDA hoat dong o che do i2c
SSPM3 = 1;
SSPM2 = SSPM1 = SSPM0 = 0; // chon che do hoat dong cua khoi MSSP la I2C mode master
SMP = 1; // su dung toc do truyen du lieu thong thuong la : 100Khz hoac 1Mhz
SSPIF = 0;
SSPADD = 0x09; // clcok_i2c = Fosc/(4*(SSPADD + 1))
}
/*===============================================================================
============= cac chuong trinh con giao tiep voi khoi i2c va slave ====*/
void wait_comp(void)
{
while(SSPIF == 0); // tuc la da xu ly du lieu tren i2c chua song
SSPIF = 0; // khi nao song thi xoa co bao ngat
}
// chuong trinh con gui bit start de khoi dong duong truyen
void start_i2c(void)
{
SEN = 1; // khoi dong dieu kien start
wait_comp(); // doi cho den khi thuc hien song
}
// chuong trinh con gui bit stop de ket thuc giao tiep i2c
void stop_i2c(void)
{
PEN = 1; // tao ra dieu kien stop de ket thuc qua trinh giao tiep
wait_comp(); // doi den khi thuc hien song
}
// chuong trinh con restart duong truyen i2c
void restart_i2c(void)
{
RSEN = 1; // tao ra mot dieu kien de resstart i2c
wait_comp();
}
// chuong trinh con gui bit ASK
void send_ask(void)
{
ACKDT = 0; // chon bit gui di la bit ASK
ACKEN = 1; // bat dau gui -- cho phep gui di
wait_comp();
}
// chuong trinh con gui di bit NASK
void send_nask(void)
{
ACKDT = 1; // chon bit gui di la bit NOT-Acknowledge
ACKEN = 1; // bat dau gui di
wait_comp();
}
// chuong trinh con ghi du lieu len duong tuyen i2c
void writer_i2c(unsigned char temp)
{
SSPBUF = temp; // truyen du lieu vao bo dem (sau do qua trinh dich bit se bat dau)
wait_comp(); // doi truyen song
}
// chuong trinh con ghi du lieu len ds1307 (slave)
void writer_ds1307(unsigned char addr_slave , unsigned char addr_data , unsigned char data )
{
start_i2c(); // khoi dong duong truyen i2c
writer_i2c(0xD0); // gui dia chi cua ds1307 len duong truyen, dong thoi kem theo bit cuoi cung de bao la se ghi len ds1307
writer_i2c(addr_data); // gui dia chi cua du lieu can ghi len slave
writer_i2c(data); // gui du lieu len slave
stop_i2c(); // ket thuc qua trinh ghi
}
// chuong trinh con doc du lieu tu ds1307
unsigned char read_ds1307(unsigned char addr_slave , unsigned char addr_data )
{
unsigned char temp;
start_i2c();
writer_i2c(0xD0); // gui dia chi cua ds1307 len duong truyen, dong thoi kem theo bit cuoi cung de bao la se ghi dia chi cua du lieu con doc
writer_i2c(addr_data); // dia chi cua du lieu can doc
restart_i2c(); // gui lenh restart de bat dau doc du lieu tu o nho can doc
writer_i2c(0xD1); // gui dia chi cua ds1307 len duong truyen i2c dong thoi kem theo bit de bao la master se doc tu slave
while( R_W ); //
RCEN = 1; // cho phep nhan du lieu
wait_comp();
send_nask(); // phat bit not asknowledge de bao khong doc nua
stop_i2c(); // gui bit stop de bao ket thuc qua trinh giao tiep i2c
temp = SSPBUF;
return(temp); // return du lieu da doc duoc tu slave
}
/*=========== ket thuc qua trinh giao tiep voi slave ==================
===============================================================================*/
// chuong trinh con phuc vu ngat
void interrupt isr(void)
{
static unsigned char count = 0;
if(T0IF == 1)
{
T0IF =0; // xoa co ngat di
count++;
TMR0 = -200;
PS2 = PS1 = PS0 = 1; // chon ty so chia tan la 1:256
if(count == 5)
{
led = ~led;
count =0;
}
}
}
// chuong trinh con tao tre thoi gian
void delay(unsigned int time)
{
while(time--)
{
// lam gi o day thi lam
}
}
// chuong trinh chinh bat dau tu day
void main()
{
config();
writer_ds1307(0xD0 , 0x07 , 0x10 ); // 00010000 cau hinh de cho chan Sout cua ds1307 hoat dong
PORTD = read_ds1307(0xD0, 0x07);
while(1)
{
//
}
}
mạch mô phỏng đây :
I2C_RTC_DS1307.X.7z
thank
