![]() |
![]() |
#5 |
Đệ tử 1 túi
Tham gia ngày: May 2012
Bài gửi: 19
: |
Giờ tớ lại có vấn đề tiếp. Tớ đã truyền được từ mater đến slave bao nhiêu byte cũng được. Nhưng để truyền từ slave lên mater thì tớ chỉ truyền được một byte đầu tiên. Ý tớ là nếu tớ truyền 8 byte bất kỳ (có thể nhiều hơn cũng được) chẳng hạn như: { 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00}. Thì tớ chỉ có truyền được 1 byte đầu tiên là : 0xFF. Nguyên lý truyền thì tớ đã nắm được nhưng tớ lại gặp vấn đề về code. Đây là code mẫu của tớ. Các cậu sửa giúp tớ nhé :
//code cho mater #include <16F877A.H> #use Delay(Clock=4000000) #define SLAVE_ADDRESS 0x10 #use i2c(master, sda=PIN_C4, scl=PIN_C3) ///////////////////////////////////////////////////////////////////////////////////////////////// ////// doan code co muc dich la con mater ra lenh con slave gui du lieu len cho no/// ///// doc gia tri tra ve ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// int8 read_I2C() { int8 value; i2c_start(); i2c_write(SLAVE_ADDRESS + 1); value = i2c_read(); i2c_stop(); return value; } void main() { int8 value, i; ///////////////////////////////////////////////////////////////////////////////////////////////// ////// doan code co muc dich la goi ham read_i2c() 8 lan //////////////////////// ////// va xuat gia tri tra ve ra cac pin cua portB /////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// set_tris_b(0); for(i = 1; i < 9; i++) { value = read_I2C(); output_b(value); } } //code cho slave #include <16F877A.H> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(Clock=4000000) #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10) int8 DIGIT[8] = { 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00}; #INT_SSP ////////////////////////////////////////////////////////////////////////////////////////////////// ///// doan code co muc dich la nhan tin hieu dieu khien tu mater ///////////////// //// va truyen 8 byte len mater ////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////// void i2c_isr() { int8 state; state = i2c_isr_state(); if(state >= 0x80) { i2c_write(DIGIT[state - 0x80]); } } void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_SSP); //////////////////////////////////////////////////////////////////////////////////////////// //doan code nay co muc dich kiem tra xem con slave co truyen dung khong//////// //////////////////////////////////////////////////////////////////////////////////////////// set_tris_b(0); int8 i; for (i = 1; i < 9; i++) { output_b(DIGIT[i - 1]); delay_ms(100); } } tớ không hiểu là con mater ra lệnh điều khiển 8 lần thì mỗi lần biến trạng thái state = i2c_isr_state() nằm ở chương trình con slave phải tăng lên tuần tự chứ và bắt đầu là 0x80 ( tiếp theo là 0x81, 0x82......). nhưng sao biến state ở chương trình con slave lại không tăng lên nhỉ. Nó cứ nằm ở 0x80 hoài...???? giúp tớ với...thân... thay đổi nội dung bởi: lab.cdt, 04-11-2012 lúc 03:21 PM. |
![]() |
![]() |
|
|