PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 24-05-2007, 11:22 PM   #1
zero
Đệ tử 4 túi
 
Tham gia ngày: Feb 2007
Bài gửi: 87
:
Send a message via Yahoo to zero
oa giao tiếp I2C hay thiệt đó.
Từ sưa đến j mình chỉ làm nội bộ trong 1 con Chíp chưa thử giao tiếp với bên ngoài theo các chuẩn có sẵn.
Ok mình sẽ nghiên cứu về cái này rồi post ý kiến lên sau. Rất cám ơn về các bài viết trên.
zero vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-05-2007, 05:26 PM   #2
hieuhic
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 11
:
Thế giới số hay thật
hieuhic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-05-2007, 05:47 PM   #3
tda
Đệ tử 3 túi
 
Tham gia ngày: Jul 2005
Bài gửi: 51
:
đệ thấy trong các phần khai báo của các master ko có ghi địa chỉ
của master trong mạng ?
Theo như bài tập của đệ thì tại 1 thời điểm chỉ có 1 con Pic
là master , con còn lại là slave , vậy đệ phải làm sao để con
kia biết nó là slave tại thời điểm đó ? Có phải nó dùng
i2c_isr_state () để đọc ko ạ?

Master thì cần địa chỉ làm gì? Vua thì ai mà chả biết là vua, trừ khi có vua 1, vua 2 cùng 1 vương quốc, lúc đó thì đánh nhau là cái chắc rồi.

Bạn thử dùng cách này thử xem.
Khi cần Pic làm master thì khai báo dòng
#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)
ngay trước cau lệnh master

còn khi cần là slave thì khai bao:
#use i2c(slave, sda=PIN_C4, scl=PIN_C3, address=..., force_hw)
ngay trước cau lệnh slave

Mình thấy trong CSS có sử dụng cách này để thay đổi chân truyền RS232 tại thời điểm cần thiết nhưng chưa thử với I2C
tda vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-06-2007, 06:22 PM   #4
huybo02
Đệ tử 4 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 61
:
Giúp mình tí nha. Đang tìm hiểu về I2C nên mới viết vài lệnh đơn giản để hiểu nó làm gì. Đã truyền được data từ master sang slave tuy nhiên có rắc rối nhỏ khi slave nhận được thì nó không thực hiện chương trình chính trong main() nữa. Mọi người giúp cách khắc phục.

master: Nhấn button ở RB0 => truyền data2
Code:
#include<16F877A.h>
#use delay(clock=1000000)
#include<def_877a.h>
#use i2c (master,SCL=PIN_C3,SDA=PIN_C4)
#use fast_io(d)
int data,data2;
#int_EXT
void ngat_RB0()
{
   i2c_start();
   i2c_write(0x10);     // slave address
   i2c_write(data2);   // Data to slave
   delay_ms(100);
   i2c_stop();
   portd =data2;
   data2++;
}
void main()
{
   ENABLE_INTERRUPTS(INT_EXT);
   ENABLE_INTERRUPTS(GLOBAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   trisd=0;
   portd=0xF0;
   data2 = 0x5;
   if (data2==255)   data2 = 0;
   while (true)
   {
   }
}
slave: Nhận data2 hiển thị portD, port B thực hiện dịch bit. Nhưng khi nhận thì portB không dịch bit nữa

Code:
#include<def_877a.h>
#use i2c (slave,SCL=PIN_C3,SDA=PIN_C4,address =0x10)
#use fast_io(d)
#use fast_io(b)
int a,value,b;
#INT_SSP
void i2c_isr()
{
   int8 state;
   state = i2c_isr_state();
   if(state < 0x80)
   {
      value = i2c_read(0);
   }
   if(state == 0x80)
   {
      i2c_write(b);
   }
      portb = value;
}

main()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);
   trisd=0;
   a=1;
   b=0b10101010;
   trisb=0;
   portb=0;
   while (true)
   {
      portd =a;
      delay_ms(500);
      if (a==128)
      {
         a=1;
      }
      else
      {
         a=a<<1;
      }
   }
}
Sẵn đây hỏi luôn làm sao để master đọc từ slave về. Và khi slave truyền bằng i2c_write() thì nó truyền dữ liệu nào?? i2c_write(b) thì nó truyền giá trị của "b" ???
huybo02 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-06-2007, 09:17 PM   #5
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Master đọc dữ liệu từ Slave theo cơ chế : đầu tiên Master chiếm quyền làm chủ (start hay restart) rùi truyền 1 byte hoặc 2 byte đầu chứa địa chỉ của slave và chế độ đọc hoặc ghi (R/W) tương ứng. R/W = 1 tức chế độ Read.

Slave sẽ luôn luôn nghe ngóng đường truyền, nếu tương thích với địa chỉ Master truyền thì nó sẽ gửi ACK xác nhận. Và khi đó, master bắt đầu đọc dữ liệu.

Chúc bạn thành công.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-06-2007, 02:32 AM   #6
minhpupil
Đệ tử 1 túi
 
Tham gia ngày: Apr 2007
Bài gửi: 11
:
Talking

Anh Falleaf có viết:
Code:
Các bạn lưu ý rằng, F nói trường hợp nâng cao, thì chúng ta hoàn toàn có quyền sử dụng mạng Multi Master. Khi bạn setup chip ở chế độ Slave, thì nó thụ động. Nhưng hãy thử nghĩ, tôi làm slave cho mạng này, và làm master của một mạng khác, vậy thì có được không? Vì tôi có tới 40 chân chứ không phải 2 chân.

Vậy nếu tôi làm master cho một mạng khác, mà trong đó slave của tôi lại là master của cái mạng mà tôi làm slave . Hoàn toàn được.

Nhưng vấn đề nâng cao ở chỗ nữa, nếu làm như vậy, tôi phải tốn 4 dây để làm 2 mạng. Vấn đề trước đây hình như F đặt ra cho Linh, nhưng Linh chưa giải quyết xong, đó là Multi Master trong một mạng dùng 2 dây thôi.

Vấn đề này F tiếp tục treo ở đây chờ người giải quyết.
Để hiểu thêm về Multi master này em phải đọc thêm ở tài liệu nào vậy anh?

Em nghĩ như thế này được không anh?
Giả sử trên mạng có 2 con Master 1 và 2 , tại 1 thời điểm chỉ có 1 con là Mater , con còn lại là Slave . Em lấy chân A0 đọc tín hiệu kích về , khi nào nó là 0 thì Master1 là master , khi nào A0=1 thì Master 2 là master.

Rồi em thay đoạn code viết trong CCS của 2 con master như sau:
Giả sử mặc định ban đầu A0=0 , tức Master1 là master:

Code:
 cho Master1
#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)
..............

  

void main()
{

set_tris_a(0x01); // A0 là chân nhập
Do
{
  if (input(pin_A0)) 
      {
         #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)
               // cho master 1 là Slave , nhưng phần này em nghĩ là chỉ đặt đầu   
               //chương trình không thể đưa ra dây.Nên ở đây em định chèn đoạn 
              // code assembly để kích thanh ghi như sau:
          #asm
              em đưa đoạn code assembly để kích thanh ghi SSPSTAT,SSPCON1
              và SSPCON2 để đưa master 1 về slave?
          #endasm
      }
   else
      {
          // em đưa đoạn code assembly để đưa Master 1 thành master  
      }

    ............
}While (1)

}
Đối với Master 2 em làm ngược lại. Như vậy đúng không anh?
Em đọc datasheet của Pic 16f877A trang 105 có nói về multi master , nhưng em chưa hiể rõ lắm, mong anh chủ giúp
minhpupil vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-06-2007, 07:46 PM   #7
tda
Đệ tử 3 túi
 
Tham gia ngày: Jul 2005
Bài gửi: 51
:
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)
// cho master 1 là Slave , nhưng phần này em nghĩ là chỉ đặt đầu
//chương trình không thể đưa ra dây.Nên ở đây em định chèn đoạn
// code assembly để kích thanh ghi như sau:

cai' nay` cung nhu 1 ham` trong C thoi, no' se set cac thanh ghi tuong ung, nen minh` nghi ko can che`n code ASM nua. Noi' the thoi, chu' minh chua thu.
tda vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-06-2007, 08:56 PM   #8
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Vấn đề khó khăn ở chỗ, hai con PIC hoạt động độc lập với nhau, nó không thể nào biết con nào hiện đang làm master hay slave. Vấn đề xảy ra khi hai con đều "cho rằng mình là master" và gửi một thông tin lên cùng một mạng. Vậy thì sẽ có sự tranh chấp. Lưu ý mạng I2C là mạng 2 dây, khi gửi lên như vậy mọi con đều nhận được và đều sử lý. Hơn nữa, nên nhớ là xung clock của master để giữ nhịp cho toàn bộ mạng, thế thì nếu 2 con cùng lúc tạo ra xung nhịp thì sẽ thế nào? Giá sử như hai con tạo ra xung nhịp khác nhau?

Những vấn đề này xử lý khá loằng ngoằng, nhưng nó được miêu tả rõ trong application note của Microchip, cái này thì F quên mất là AN số bao nhiêu, các bạn tự tìm lại.

Tuy nhiên, lúc F giao cho Linh làm cái bài này, thì vì Linh sử dụng CCS C, cho nên gặp một số khó khăn vì chưa quen sử dụng. Vậy bạn nào có thể làm lại cái AN của Microchip chăng và phân tích rõ vấn đề hơn.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-06-2007, 09:19 PM   #9
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trong datasheet của các chip thường có nói về chế độ multi-master trong giao tiếp I2C (PIC16F877A chẳng hạn) và trong AN735 có ví dụ về cách hiện thực I2C multi-master.

Trong AN736 đề cập đến mạng sử dụng giao thức I2C, trong này cũng có hiện thực I2C multi-master.

Tinh thần chính là sử dụng ngắt báo hiệu xung đột bus khi một chip thử trở thành master (thực sự) trên bus, dùng cờ ngắt BCLIF. Khi phục vụ ngắt này, chip sẽ chờ một khoảng thời gian ngẫu nhiên nào đó và thử thực hiện lại việc chiếm quyền chỉ huy bus.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-06-2007, 12:36 AM   #10
minhpupil
Đệ tử 1 túi
 
Tham gia ngày: Apr 2007
Bài gửi: 11
:
Talking

em có nghiên cứu sơ về I2C multimaster , có một số tài liệu post lên cho mọi người tham khảo (tài liệu tham khảo thôi không chắc đúng , he he nhất là
tham khao i2c multimaster.doc đó).

Sau đây là trang web viết lập trình I2C multi master của CCSC

http://www.ccsinfo.com/forum/viewtop...535d38622cb8a4
File Kèm Theo
File Type: rar I2C multi master.rar (211.8 KB, 1580 lần tải)
minhpupil vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-10-2007, 12:42 PM   #11
vandungevn
Đệ tử 5 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 116
:
Send a message via Yahoo to vandungevn
Ai đã làm trên MCC18 giao tiếp I2C chạy chưa, Dũng chỉ ghi được nhưng chưa đọc được, đang làm các mô đun tổng thể đưa ra giáo trình MCC18, anh em giúp với nhé, thanks.
__________________
Hãy chung sức vì nền Điện Tử Viêt Nam...! Sản Phẩm thương hiệu Việt "Made in Viet Nam"
Nguyen Van Dung - Nguyễn Văn Dũng. Mobile : (+84) 97 329 1368
Nick name : VanDungEvn ( Yahoo + Skype )
Tư vấn & thiết kế điện tử + Làm mạch in + Hoàn thiện sản phẩm điện tử. Mạch nạp 89-PIC-AVR.
Email: vandungevn@gmail.com Website: www.dientuphuongdung.com
Xóm Mới - Nguyên Xá - Minh Khai - Từ Liêm - Hà Nôi - Viet Nam.
vandungevn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-10-2007, 12:25 PM   #12
Beginner
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 14
:
Talking

Các bác cho em hỏi tý:
int8 read_I2C(int8 slave_addr)
{
int8 value_re;
i2c_start();
i2c_write(slave_addr + 1);
value_re = i2c_read(0);
i2c_stop();
return value_re;
}

Khi nào thì dùng i2c_read(0),khi nào thì dùng i2c_read(1).
Có phải là(???):i2c_read(1):ra dấu ACK,tiếp tục nhận dữ liệu
i2c_read(0):ra dấu NACK,báo quá trình nhận dữ liệu kết thúc.
Như vậy là code trên nhận đúng 1byte phải không ạ?Em nghĩ thế ko biết đúng hay sai?
Beginner vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-10-2007, 06:40 PM   #13
vandungevn
Đệ tử 5 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 116
:
Send a message via Yahoo to vandungevn
i2c_read(0); // No ACK - Stop read i2c
i2c_read(1); // ACK - Reply after read i2c

theo mình thì: đọc 1 byte dùng lệnh i2c_read(1); là ok .
bạn muốn rõ hơn thì đọc về i2c trong datasheet của DS1307, trong đó giới thiệu về cách truyền và nhận i2c.

Chúc thành công....!
File Kèm Theo
File Type: pdf DS1307.pdf (856.4 KB, 1080 lần tải)
__________________
Hãy chung sức vì nền Điện Tử Viêt Nam...! Sản Phẩm thương hiệu Việt "Made in Viet Nam"
Nguyen Van Dung - Nguyễn Văn Dũng. Mobile : (+84) 97 329 1368
Nick name : VanDungEvn ( Yahoo + Skype )
Tư vấn & thiết kế điện tử + Làm mạch in + Hoàn thiện sản phẩm điện tử. Mạch nạp 89-PIC-AVR.
Email: vandungevn@gmail.com Website: www.dientuphuongdung.com
Xóm Mới - Nguyên Xá - Minh Khai - Từ Liêm - Hà Nôi - Viet Nam.
vandungevn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2007, 10:47 AM   #14
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
tai liau i2c

mình có tài liệu viết i2c bấng phần mền khá hay mong sẽ giúp dc các bạn
bạn xem từ trang 340
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2007, 10:55 AM   #15
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
sao em khong thể úp lên dc vậy

namqn: bạn kiểm tra dung lượng tập tin của bạn xem có vượt quá giới hạn cho phép khi upload hay không. Nếu vượt quá dung lượng cho phép thì bạn có thể gửi email cho F (địa chỉ email nằm ở phần chữ ký của F).

thay đổi nội dung bởi: namqn, 28-10-2007 lúc 05:31 PM.
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam