PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   Giao tiếp I2C (http://www.picvietnam.com/forum/showthread.php?t=611)

quoc_nguyen 01-03-2008 12:20 AM

Cam on ban Namqn. Web bạn gửi mình đọc không được. Mình dùng 2 con 16f877a giao tiếp qua i2c và lập trình css C. có phải i2c_read(0) tức là nhận dữ liệu và gửi xung NACK đi không. Mình gửi 5byte dữ liệu liên tiếp từ slave--->master, giờ cho nó dừng lại để làm việc khác nhưng không biết dừng bằng cách nào hết. Bạn cho mình biết rõ hơn về lệnh i2c_isr_state() , giá trị 0x80 và lớn hơn 0x80 khác nhau chỗ nào.
thanks.

namqn 01-03-2008 01:09 AM

Trích:

Nguyên văn bởi quoc_nguyen (Post 14578)
Cam on ban Namqn. Web bạn gửi mình đọc không được. Mình dùng 2 con 16f877a giao tiếp qua i2c và lập trình css C. có phải i2c_read(0) tức là nhận dữ liệu và gửi xung NACK đi không. Mình gửi 5byte dữ liệu liên tiếp từ slave--->master, giờ cho nó dừng lại để làm việc khác nhưng không biết dừng bằng cách nào hết. Bạn cho mình biết rõ hơn về lệnh i2c_isr_state() , giá trị 0x80 và lớn hơn 0x80 khác nhau chỗ nào.
thanks.

Trang web của tôi cũng chỉ dùng Unicode như diễn đàn này thôi, có điều lần đầu load trang web thì có thể bạn phải chấp nhận thông tin bảo mật là không khớp (không rõ bộ phận quản trị mạng của ĐHBK HCM làm thế nào đó mà sinh ra lỗi này). Tôi không dùng CCS C, nên nếu trả lời các vấn đề cụ thể trong CCS C thì cũng chỉ mở tài liệu hướng dẫn của CCS C ra để đọc giúp bạn thôi. Bạn có thể tự làm điều đó.

Để có thể thực hiện thao tác ACK/NACK với hàm i2c_read(), bạn phải dùng 2 tham số, như trong tài liệu hướng dẫn đã viết. Nếu muốn NACK và bạn chỉ có 1 stream, bạn có thể dùng i2c_read(0, 0). Bạn cũng nên có stream = 0 trong phần dẫn hướng #use i2c. Ý nghĩa của trị trả về của hàm i2c_isr_state() đã được ghi rõ trong tài liệu hướng dẫn, 0x80 là địa chỉ khớp, cần đáp ứng bằng một hàm i2c_write(), còn 0x81 - 0xFF là hoàn thành việc phát dữ liệu, và đã nhận được ACK, cần đáp ứng bằng một hàm i2c_write().

Thân,

quoc_nguyen 22-03-2008 11:11 AM

Rắc rối I2C
 
Mình thực hiện truyền dữ liệu giữa 2 con Pic6f877a bằng I2C (master --> slave), sử dụng CSS C. Việc truyền từng byte thì OK, còn truyên liên tiếp nhiều byte thì mình gặp rắc rối ở chỗ sau khi truyền xong thì không dừng chương trình được. Mình nghĩ bị lỗi ở chỗ không gửi được tín hiệu Nack qua slave. Mong nhh.mecha chỉ giáo. bạn giải thích mình cách dùng i2c_read(), và i2c_read(0); làm sao để dừng giao tiếp i2c sau khi đã truyền một lúc nhiều byte.

nhh 22-03-2008 12:07 PM

- i2c_read(); đọc 1 byte từ bus i2c và tạo xung ACK
- i2c_read(0); đọc 1 byte từ bus i2c và tạo xung NACK, dùng trước khi i2c_stop(); kết thúc đọc dữ liệu.

Muốn ghi nhiều byte liên tiếp tới SLAVE: Sau khi gửi địa chỉ, gửi liên tiếp các byte cần ghi, muốn ngừng dùng i2c_stop();

Bạn tham khảo tutorial ở trang 1 của anh F gửi, xem format ghi nhận dữ liệu.

Bạn có thể gửi code lên.

quoc_nguyen 02-04-2008 03:54 PM

master - multi slave
 
Bạn nào đã làm giao tiếp i2c chế độ một master nhiều slave cho mình hỏi tí.
Mình dùng Css C, sử dụng 3 con pic 16f877a trong đó 1 master và 2 slave có một bàn phím ở master để điều khiển lấy dữ liệu từ slave. không hiểu sao chỉ chạy đúng được một trong 2 con, sau đó luôn gửi về giá trị 255.

tam_pascal 22-04-2008 06:24 PM

Trích:

Nguyên văn bởi quoc_nguyen (Post 15309)
Bạn nào đã làm giao tiếp i2c chế độ một master nhiều slave cho mình hỏi tí.
Mình dùng Css C, sử dụng 3 con pic 16f877a trong đó 1 master và 2 slave có một bàn phím ở master để điều khiển lấy dữ liệu từ slave. không hiểu sao chỉ chạy đúng được một trong 2 con, sau đó luôn gửi về giá trị 255.

- Mình dùng thêm một dây nữa nối từ M-S, dây này do S điều khiển = 0 báo cho M biết là S muốn truyền dữ liệu đến M, khi S truyền xong thì cho dây này =1. Còn M cứ thấy dây này =0 là hỏi S và nhận data về. Chứ kết nối hai dây thì M cứ phải hỏi liên tục( mỏi miệng)..hihi. chúc vui
- Tiện thể cho mình hỏi một chút: mình dùng Master =18f4550 và slave=16f877a địa chỉ 0x10 thì tốt, khi chuyển sang dùng 2 con đều là 18f4550 khi lại không đc, (vẫn địa chỉ 0x10) Hay ở 18f4550 con slave phải có địa chỉ khác nhỉ. Ai biết chỉ giúp mình với....xin cảm ơn trước.

electronicltv 24-04-2008 12:46 PM

Cấu hình cho I2C của pic8F4431 dùng pin_D2 và pin_D3 như sau:
trường hợp 1:
Code:

#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C5, address=0xa0,force_hw,slow)

trường hợp 2:
Code:

#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_D2, SCL=PIN_D3, address=0xa0,force_hw,slow)

Tìm hoài k thấy tài liệu hướng dẫn về dzụ này. Với trường hợp 1 thì chạy đúng mặc dù phần mềm chọn pin_c4 và C5 còn phần cứng dùng Pin_D2 và D3. Còn trường hợp 2 là pó chíu luôn, kô xảy ra ngắt SSP luôn. Tìm ra hai trường hợp này là phải ngồi "mò" cả ngày, hic
Vậy giải thích hai trường hợp này: do CCS "chuối" hay do người dùng "gà" quá?

pictd03 28-04-2008 02:28 AM

PIC và RS_485
 
xin cho mình hỏi, có ai đã từng làm giao tiếp PIC16f877a với RS_485 chưa? vì mình đang thiết kế mạng dùng 485 kết nối với PIC, nếu có hướng dẫn dùm mình nha, thanks!
Anh Nam nếu biết chỉ giáo em với nha! thanks

namqn 28-04-2008 02:50 AM

Trích:

Nguyên văn bởi pictd03 (Post 15841)
xin cho mình hỏi, có ai đã từng làm giao tiếp PIC16f877a với RS_485 chưa? vì mình đang thiết kế mạng dùng 485 kết nối với PIC, nếu có hướng dẫn dùm mình nha, thanks!
Anh Nam nếu biết chỉ giáo em với nha! thanks

Tôi thử dùng các từ khóa "PIC" và "RS-485" thì thấy có nhiều project trên mạng, có sơ đồ nguyên lý và mã nguồn. Tôi chưa từng làm về vấn đề này, nên có lẽ không giúp gì cho bạn được.

Thân,

Table 13-05-2008 12:06 AM

Re:
 
Trích:

Nguyên văn bởi electronicltv (Post 15751)
Cấu hình cho I2C của pic8F4431 dùng pin_D2 và pin_D3 như sau:
trường hợp 1:
Code:

#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C5, address=0xa0,force_hw,slow)

trường hợp 2:
Code:

#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_D2, SCL=PIN_D3, address=0xa0,force_hw,slow)

Tìm hoài k thấy tài liệu hướng dẫn về dzụ này. Với trường hợp 1 thì chạy đúng mặc dù phần mềm chọn pin_c4 và C5 còn phần cứng dùng Pin_D2 và D3. Còn trường hợp 2 là pó chíu luôn, kô xảy ra ngắt SSP luôn. Tìm ra hai trường hợp này là phải ngồi "mò" cả ngày, hic
Vậy giải thích hai trường hợp này: do CCS "chuối" hay do người dùng "gà" quá?

Cái này cũng có nghe rồi, mấy bồ đã bị thì kêu CCS chuối. còn tui đang làm trên C18 thấy tình hình còn...chuối hơn. huhu

tungtot_vl 13-05-2008 09:01 AM

bác nào làm giao tiếp i2c giữa pic với eeprom 24XX rồi chỉ cho tôi với.
dùng protue có mô phỏng eeprom 24XX được không hả các bác.
khi tôi mô phỏng thì không thấy chạy gì cả. kích chuột vào eeprom thì thấy nó đòi có file binary ở phần initial contents ò memory không biết file này phải lấy từ đâu ra nhỉ mong các cao thủ chie giúp

toanck86 20-05-2008 11:44 PM

Chào mọi người!
Cho mình hỏi về ví dụ của bạn Hoanf (ví dụ có kèm hình sơ đồ nguyên lý), mình mô phỏng bằng protues thì chạy đúng như yêu cầu bài toán, nhưng lắp mạch thật thì không chạy được. Có cẩn phải chú ý gì từ sơ đồ đó không! :(

cuong86vt 15-06-2008 05:10 PM

1 Attachment(s)
Trích:

Nguyên văn bởi toanck86 (Post 16835)
Chào mọi người!
Cho mình hỏi về ví dụ của bạn Hoanf (ví dụ có kèm hình sơ đồ nguyên lý), mình mô phỏng bằng protues thì chạy đúng như yêu cầu bài toán, nhưng lắp mạch thật thì không chạy được. Có cẩn phải chú ý gì từ sơ đồ đó không!

Thằng Toàn làm được mạch I2C chạy ngon lành luôn rồi cũng không thèm Post lên diễn đàn cho mọi người cùng học hỏi gì cả ! Đề nghị Admin tước level "1 túi" của nó ! :mad:

:happyday: PICVIETNAM tròn 1 tuổi ! :beer:

Mình mới viết xong một chương trình I2C dùng 1 Master điều khiển mạng 4 Slave bằng 4 nút ngắt RB, tất cả đều dùng 16f877a, mình xin post lên đây mong các bạn góp ý.

Phần cứng: 4 nút nhấn ngắt ngoài rb4 -> rb7 dùng để điều khiển 4 Slave, nhấn nút nào thì Master gọi Slave đó chạy ct Master gửi xuống, còn các Slave khác "ngồi chơi". 2 chân SDA và SCL của các VDK nối nhau kéo lên 4k7, PORTD của 4 Slave quét 8 led...

Phần mềm: 4 Slave có địa chỉ lần lượt là 0x10, 0x20, 0x30, 0x40 nên chương trình của 4 Slave hoàn toàn như nhau, chỉ khác cái khai báo ban đầu address là 4 địa chỉ trên.


ct của Master:
Code:

#include <16f877a.h>
#include <def_877a.h>
#use delay(clock = 20000000)
#fuses HS, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOPROTECT
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, force_hw)

const unsigned int8 dulieu[]={1,2,4,8,16,32,64,128};
const unsigned int8 address_slave[]={0,0x10,0x20,0x30,0x40};
int8 a,i,kytu;

void ghi(int8 address,int8 data)
  {
      i2c_start();
      i2c_write(address);
      i2c_write(data);
      i2c_stop();
  }
 
#INT_RB
void ngat_RB()
  {
      if((RBIF)&&(RBIE))
        {
            if(RB4==0)
              {
                  a=1;
                  i=0;               
              }             
            else if(RB5==0)
              {
                  a=2; 
                  i=0;               
              }             
            else if(RB6==0)
              {                 
                  a=3; 
                  i=0;                 
              }             
            else if(RB7==0)
              {               
                  a=4; 
                  i=0;                 
              }
        }
      RBIF=0;
  }

void main()
  {
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_RB);
      set_tris_d(0);
      portd=0;
                 
      while(TRUE)
        {         
            kytu=a;
            delay_ms(100);
           
            while(kytu==a)
              {
                  if(a!=0)
                    {
                        delay_ms(50);
                        ghi(address_slave[a],dulieu[i]);
                        i++;
                        if(i==8)
                          {
                              i=0;
                          }
                    }
              }           
         
        }
  }

ct của 4 Slave, chỉ khác nhau 4 address:
Code:

#include <16f877a.h>
#include <def_877a.h>
#use delay(clock = 20000000)
#fuses HS, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOPROTECT
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)
 
int8 dulieu;
 
#INT_SSP
void ngat_i2c()
  {
      int8 state;
      state = i2c_isr_state();           
      if(state < 0x80)
        {
            dulieu = i2c_read();
            portd = dulieu;
            delay_ms(50);
        }
  }
 
void main()
  {
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_SSP);
      set_tris_d(0);
           
      while(TRUE)
        { 
            portd = 0;
        }
  }

Mạch mình chạy mô phỏng bằng Proteus thấy có đặc điểm: nếu chỉ nối 1 M và 1 S thì quét led đúng thời gian delay 50ms, còn nối 4 S vào thì dường như led quét rất chậm không đúng 50 ms nữa, nhưng mình nghĩ Proteus chỉ mô phỏng thời gian thực, còn nếu là phần cứng thật thì sẽ chạy đúng yêu cầu như trong code...

Em muốn post sơ đồ mạch lên mà không biết chèn code như thế nào, mong Admin chỉ giùm em cách tải file từ máy...

hopeman 04-07-2008 12:29 PM

Trích:

Nguyên văn bởi electronicltv (Post 15751)
Cấu hình cho I2C của pic8F4431 dùng pin_D2 và pin_D3 như sau:
trường hợp 1:
Code:

#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C5, address=0xa0,force_hw,slow)

trường hợp 2:
Code:

#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD
#use delay(clock=20000000)
#use i2c(SLAVE, SDA=PIN_D2, SCL=PIN_D3, address=0xa0,force_hw,slow)

Tìm hoài k thấy tài liệu hướng dẫn về dzụ này. Với trường hợp 1 thì chạy đúng mặc dù phần mềm chọn pin_c4 và C5 còn phần cứng dùng Pin_D2 và D3. Còn trường hợp 2 là pó chíu luôn, kô xảy ra ngắt SSP luôn. Tìm ra hai trường hợp này là phải ngồi "mò" cả ngày, hic
Vậy giải thích hai trường hợp này: do CCS "chuối" hay do người dùng "gà" quá?

mình cũng đã từng gặp trường hợp như bạn. theo mình nghĩ thì có thể là vì từ khóa "force_hw" tức là dùng phần cứng mặc định, vì vậy dù bạn khai là chân D2 và D3 nhưng tín hiệu vẫn ra chân C4 C5 ( con 4431 có 2 đường i2c mà ), bạn thử bỏ từ khóa này đi xem sao .

mấy hôm rồi mình bị mất đồng bộ gửi nhận suốt, các bạn nếu mới làm nhớ để ý bên con slaver trong quá trình nhận nhé
mình khuyến cáo nên dùng cấu trúc sau để nhận trong trình xử lý ngắt #INT_SSP ssp :
while(count_i2c!=4) {

while(!i2c_poll()) ;

buffer[count_i2c++]= i2c_read(); //Read Next

}
hy vọng ko ai phải mất thời gian về i2c nhiều như mình .hichic

dientubk3 15-08-2008 04:24 PM

Hi ! Có bạn nào nghiên cứu về I2CSB-I2C Slave Base không thươ1ng dẫn em nhé!Thanks.Có tài liệu chi tiết nào về sơ đồ khối hay gì đó thì send cho em nhé!Thiết kế I2CSB giống nhu thiết kế 1 khối IP phải ko ạh?Help me please!!!

dientubk3 16-08-2008 12:16 AM

so đồ khối i2CSB!Ai biết phân tích dùm nhé!!!
 
1 Attachment(s)
Đây là sơ đồ khối chi tiết cuả I2CSB!Bạn nào biết phân tích chi tiết nhiệm vụ và chức năng của từng khối cho mình nhé!mình cảm ơn nhiều.Và nếu mình thiết kế 1 khối IP-I2CSB như vậy thì cần phải bắt đầu như thế nào ,mong các bạn góp ý nhé!Thanks a lot!!!

namqn 16-08-2008 02:06 AM

Trích:

Nguyên văn bởi dientubk3 (Post 18168)
Đây là sơ đồ khối chi tiết cuả I2CSB!Bạn nào biết phân tích chi tiết nhiệm vụ và chức năng của từng khối cho mình nhé!mình cảm ơn nhiều.Và nếu mình thiết kế 1 khối IP-I2CSB như vậy thì cần phải bắt đầu như thế nào ,mong các bạn góp ý nhé!Thanks a lot!!!

Bạn đang tìm hiểu việc hiện thực module I2C ở chế độ slave trên logic khả trình (programmable logic) phải không? Nếu đúng thì bạn nên hỏi ở www.dientuvietnam.net, diễn đàn này chủ yếu dành cho PIC.

Thân,

dientubk3 16-08-2008 10:08 AM

Vậy trong www.dientuvietnam.net bạn có biết topic nào nói về I2C không thì chỉ cho mình với nhé?Hoặc có trang web tiếng việt nào bàn về I2C ko thì báo dùm mình với nhé!!!Thanks.

minhsondaklak 16-08-2008 07:31 PM

I2C trên MikroC
 
I2C với Pic 16f877A:
http://www.picvietnam.com/forum//showthread.php?t=2644

I2C với Pic 16f84A:
http://www.picvietnam.com/forum//showthread.php?t=2671

hmk 17-08-2008 04:30 PM

Chào các bạn,

Tôi đang dùng PIC 18F4520 làm đồng hồ thời gian thực sử dụng ds1307. Dùng MPLAB C18 để lập trình và các thư viện chuẩn của MCC18. Tôi mô phỏng trên proteus thì chạy ngon lành nhwng mang ra làm mạch thật thì không chạy. Tôi dùng hàm OpenI2C(MASTER, SLEW_OFF) để cho phép I2C và tạo tốc độ 100kHz trên SCL (theo chú thích trong thư viện) nhưng thực tế thì khi dùng osciloscope để đo tần số trên SCL thì thấy tốc độ khoảng 500kHz khi có truyền dữ liệu. Bạn nào biết lý do tại sao và cách khắc phục thi giúp tôi nhé. Thanks nhiều.

hmk

ntn60 29-08-2008 06:45 PM

Trích:

Nguyên văn bởi hmk (Post 18195)
Chào các bạn,

Tôi đang dùng PIC 18F4520 làm đồng hồ thời gian thực sử dụng ds1307. Dùng MPLAB C18 để lập trình và các thư viện chuẩn của MCC18. Tôi mô phỏng trên proteus thì chạy ngon lành nhwng mang ra làm mạch thật thì không chạy. Tôi dùng hàm OpenI2C(MASTER, SLEW_OFF) để cho phép I2C và tạo tốc độ 100kHz trên SCL (theo chú thích trong thư viện) nhưng thực tế thì khi dùng osciloscope để đo tần số trên SCL thì thấy tốc độ khoảng 500kHz khi có truyền dữ liệu. Bạn nào biết lý do tại sao và cách khắc phục thi giúp tôi nhé. Thanks nhiều.

hmk

Có thể do bạn dùng thạch anh tần số gấp 5 lần, thường thì các hàm trong thư viện dùng với thạch anh 4MHz

hopeman 03-09-2008 04:01 PM

Trích:

Nguyên văn bởi hmk (Post 18195)
Chào các bạn,

Tôi đang dùng PIC 18F4520 làm đồng hồ thời gian thực sử dụng ds1307. Dùng MPLAB C18 để lập trình và các thư viện chuẩn của MCC18. Tôi mô phỏng trên proteus thì chạy ngon lành nhwng mang ra làm mạch thật thì không chạy. Tôi dùng hàm OpenI2C(MASTER, SLEW_OFF) để cho phép I2C và tạo tốc độ 100kHz trên SCL (theo chú thích trong thư viện) nhưng thực tế thì khi dùng osciloscope để đo tần số trên SCL thì thấy tốc độ khoảng 500kHz khi có truyền dữ liệu. Bạn nào biết lý do tại sao và cách khắc phục thi giúp tôi nhé. Thanks nhiều.

hmk

bạn hãy để ý lại phần khai báo tần số dao động của mình, tôi nghĩ là đã có nhầm lẫn ở đâu đó trong phần này dẫn tới các hàm của bạn dùng tính toán với tần số dao động bị sai

dientubk3 09-09-2008 11:06 AM

Chào!Mình đang nghiên cứ giao tiếp giữa LCD thường với I2c điều khiển bởi Master là Pic.Vậy giao tiếp giữa LCD và I2C trên thực tế phần cứng mình phải giao tiếp như thế nào đây,giao tiếp những chân nào với nhau ?Còn đối vớ Rom thì sao?Vì Rom ngoài địa chỉ Slave ra còn có địa chỉ của từng thanh ghi trong Rom ,Mình sẽ giao tiếp với từng thanh ghi như thế nào đây?Trên thị trường hiện nay có Lcd,Rom nào tích hợp sẵn I2C không nhỉ?Hepl me!Please!

dientubk3 09-09-2008 11:11 AM

Àh,hình như chuẩn I2C không có cơ chế báo lỗi bit trên đường truyền phải không các bạn?Ngoài ACK chỉ dùng báo khi truyền hết một byte dữ liệu còn Nack chỉ dùng khi không nhận được vậy còn cơ chế báo lỗi ,kiểm tra lỗi bit hay lỗi trên đường truyên thì không có phải không?Ai biết giúp mình với nhé!Thanks.

tallht 09-09-2008 06:37 PM

theo mình được biết thì có mấy loại eeprom của atmel có tích hợp i2c đó: At24c01,at24c02,04,...

dientubk3 11-09-2008 12:46 AM

Chà !Sao ko thấy anh em giúp mình vậy cà?Help me ,please!!!

dientubk3 11-09-2008 12:52 AM

Àh,còn câu hỏi nữa là các đường SDA,SCL sử dụng theo hàm "And "nối dây.Vậy thì trên một bus I2C có nhiều Mater và Slave thì cấu trúc mạch thực tế như thế nào ?Có hàm And nối dây trên mạch hay không ?Có gì úp dùm mình một tấm hình thực tế nhé!Mình nghĩ đây cũng là những điều cơ bản về I2C.Chắc mọi người sẽ dành thời gian giúp mình .Thanks a lot!

hopeman 11-09-2008 11:22 AM

Trích:

Nguyên văn bởi dientubk3 (Post 18727)
Àh,hình như chuẩn I2C không có cơ chế báo lỗi bit trên đường truyền phải không các bạn?Ngoài ACK chỉ dùng báo khi truyền hết một byte dữ liệu còn Nack chỉ dùng khi không nhận được vậy còn cơ chế báo lỗi ,kiểm tra lỗi bit hay lỗi trên đường truyên thì không có phải không?Ai biết giúp mình với nhé!Thanks.

việc ở trạng thái thông thường cả SDA và SCL ở mức cao cũng là một cách để nhận biết được sự cố "đứt dây" trong quá trình truyền, còn cơ chế báo lỗi bit thì thực sự là mình chưa nghe nói đến ở chuẩn giao tiếp I2C

piano lover 13-09-2008 02:57 PM

Cho mình hỏi cách khai báo tốc độ truyền I2C trong CCS như thế nào, vì phần cứng chỉ hổ trợ tối đa 400 Kbps nhưng trong phần help có ví dụ fast=450000 (sets the target speed to 450 KBSP) và giá trị đó khai báo bao nhiêu cũng không báo lỗi, chẳng bít thằng CCS nó hiểu như thế nào? và 400Kbps là tốc độ tối đa trong Pic hay là tốc độ tối đa của chuẩn I2C? chiều dài tối đa của bus I2C hổ trợ là bao nhiêu? trên trang web này nó bảo là 100m ở tốc độ 500Hz http://www.esacademy.com/faq/i2c/q_and_a/faq/i2cqa1.htm

thienthan_den 17-09-2008 05:47 PM

Đồng Bộ Trong Giao Tiếp I2C
 
Em có một chút thắc mắc về giao tiếp I2C: Không biết quá trình truyền và nhận dữ liệu giữa master và slave được đồng bộ nhờ phần cứng hay là nhờ thằng CSS hoặc là tự mình phải làm lấy? Chuyện gì xảy ra khi master truyền dữ liệu mà không nhận được ACK từ slave? Nó sẽ truyền lại byte dó hay là cứ chờ? Một vấn đề nữa là khi dùng hàm i2c_isr_state() đọc trạng thái của bus i2c và trả về giá trị <0x80 thì mình có phải đợi cho dữ liệu ổn định bằng cách dùng delay_ms(x) trước khi dùng i2c_read() không? Chương trình của em viết khi không có delay_ms() thì slave không đọc được giá trị về? Không biết có phải em viết sai không. Mong mọi người giúp đỡ.
PS: hôm nay không mang code theo nên không up lên được,mong mọi người thông cảm.

piano lover 19-09-2008 05:49 PM

Sao không ai giúp mình hết vậy?

dientubk3 05-10-2008 10:19 PM

Mình đang làm về I2CSB,dùng để diều khiển các thiết bị thụ động như LCD ,ram.Bây giờ mình ra ngoài thị trường mua loại LCD bình thường không tích hợp bus I2C và một Pic có tích hợp I2C làm Master điều khiển.con I2CSB mình sẽ tạo ra ,vậy mình nên mua lạoi LCD nào ?Pic nào phổ biến trên thị trường để phục vụ cho nghiên cứu của mình đây!Vui lòng giúp mình nhé!!!Thanks

duong4747 06-10-2008 09:21 AM

Giao tiep I2C
 
Chào các bác, e đang viết chương trình giao tiếp dùng I2C giữa Pic16f877 và DS1307 trong MPLAP IDE mà không được, vấn đề nằm ở chỗ khai báo sử dụng chân SCL và SDA trong portc. Xin hỏi bác nào có đoạn code khai báo viết trong MPLAP IDE thì port lên cho e với, e cảm ơn nhiều!

tungtot_vl 09-10-2008 11:39 AM

i2c
 
chào các bác mình đang làm giao tiếp i2c với 24c64.
mình coppy trong file hell của ccs ra và chạy thử cho 1 byte.
khi hàm ghi và đọc được dùng ở ngoài vòng lặp white() thì chương trình đọc đúng giá trị ghi vào.
nhưng khi bỏ hàm ghi và đọc và vòng lặp white() thì chương trình chỉ đọc đúng lần đầu tiên. khi lặp lại vòng lặp thì bị sai.
hoặc nếu ghi và đọc nhiều lần cho từng byte thì data dọc ra cũng bị sai. mình không rỏ vì sao mong các bạn chỉ giúp.
#include<18f4680.h>
#fuses NOLVP,NOWDT,PUT,hs,NOPROTECT,NOBROWNOUT
#device 18f4680*=16 ADC=10 // high_ints=true
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
int k;

////////////////////////////////////////////////////////////////////////
#ifndef EEPROM_SDA

#define EEPROM_SDA PIN_b1 //b1
#define EEPROM_SCL PIN_b0//b0

#endif

#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)

#define EEPROM_ADDRESS long int
#define EEPROM_SIZE 8192

void init_ext_eeprom()
{
output_FLOAT(EEPROM_SCL);
output_FLOAT(EEPROM_SDA);
}

void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xa0);
i2c_write((address>>8)&0x1f);
i2c_write(address);
i2c_write(data);
i2c_stop();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
}

BYTE read_ext_eeprom(long int address) {
BYTE data;
i2c_start();
i2c_write(0xa0);
i2c_write((address>>8)&0x1f);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
output_d(data);
return(data);
}

void main()
{
set_tris_A(0x00);
set_tris_b(0x00);
set_tris_C(0x00);
set_tris_D(0x00);
set_tris_E(0x00);
/////////////////////////
write_ext_eeprom(10,8);
read_ext_eeprom(10);
while(1)
{
delay_ms(1000);

}
}
/////////////////////////////////////////////////
nếu bỏ các hàm vào vòng lặp thì chỉ chạy đúng lần đầu tiên. các lần còn lại là sai
while(1)
{
write_ext_eeprom(10,8);
read_ext_eeprom(10);
delay_ms(1000);

}
//////////////////////////////
ghi và đọc nhiều lần cũng bị sai data
while(1)
{
write_ext_eeprom(10,8);
read_ext_eeprom(10);
delay_ms(1000);
write_ext_eeprom(12,6);
read_ext_eeprom(12);
delay_ms(1000);


}

ketxanh 22-10-2008 03:04 PM

tui moi lam xong giao tiep i2c giữa pic8f2550 và pic 18f4550, chương trình chạy ngon lành. anh em nào có hứng thú tui post lên cho

falleaf 09-11-2008 01:14 PM

Trích:

Nguyên văn bởi ketxanh (Post 19795)
tui moi lam xong giao tiep i2c giữa pic8f2550 và pic 18f4550, chương trình chạy ngon lành. anh em nào có hứng thú tui post lên cho

Bạn nên post bài của bạn lên luôn, vì rất nhiều người đã làm vấn đề này, và cần càng nhiều bài tham khảo càng tốt, từ đó người đọc sẽ biết thêm nhiều cách để tối ưu code của mình.

Chúc vui

ketxanh 23-11-2008 11:21 PM

I2c
 
1 Attachment(s)
Xin lỗi anh em vi minh post hơi chậm.Mong mọi người đóng góp ý kiến nhé

ketxanh 04-12-2008 08:30 AM

không biết co ai quan tâm cái i2c của tui không, mà không thấy đóng góp ý kiên gì, hay cái cảm ơn gì hết ta.....buồn wa. không thi mọi ngừoi chê tui cũng được đặng tui còn biết để mà sửa lỗi lầm

bien_van_khat 05-12-2008 10:19 AM

Trích:

Nguyên văn bởi ketxanh (Post 21134)
không biết co ai quan tâm cái i2c của tui không, mà không thấy đóng góp ý kiên gì, hay cái cảm ơn gì hết ta.....buồn wa. không thi mọi ngừoi chê tui cũng được đặng tui còn biết để mà sửa lỗi lầm

Có thể bây giờ chưa có bạn nào gặp rắc rối về I2C, tuy nhiên mai mốt, ai đó cần code mẫu về I2C cho cả slave - master viết = CCS chắc chắn sẽ rất cảm ơn code của bạn. :D

dientubk3 19-12-2008 11:06 PM

Hi các Pro !Em có chương trình viết cho Pic 16f877A,chế độ Mater i2c.Giao tiếp với LCD16x2 chế độ 4bit,giao tiếp với i2c slave và bàn phím 4x4 nữa!Chương trình của em là :
+Khi nhấn một phím 4x4 thì sẽ phát một dữ liệu lên LCD và đồng thời dữ liệu đó cũng được truyền trên I2C Bus tới Slave.Em chỉ mới biết C cho CCS ,còn non quá!Bác nào có thể chỉ giáo em giao tiếp pic 16f877a với bàn phím 4x4 đồng thời hiển thị LCD và truyền I2C như trên được ko ?Thanks các Pro!


Múi giờ GMT. Hiện tại là 06:27 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam