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