PDA

View Full Version : So sánh CAN , I2C, SPI, USART như thế nào ?


bbaacc01
20-07-2009, 10:37 PM
Mình thấy nhiều con PIC có tích hợp cả bốn cái CAN, I2C, SPI, USART.
Mong các bạn có kinh nghiệm giúp mình có một cái so sánh vắng tắt giữa những giao tiếp này

tốc độ truyền ?
Kiểu Master - Slave ?
Tính an toàn (truyền bị lỗi)

cứ lấy một con DSPIC hay PIC nào đó có hỗ trợ cả 4 cái này và so sánh với nhau. (giả sử con 33FJ128MC710 chạy ở 40 MIPS đi) để mình có thể thấy được giá trị cụ thể của tốc độ truyền (1,2,3,4... Mbit/s )

Ví dụ :
a. nếu mình muốn truyền dữ liệu từ một vi xử lí tới nhiều vi xử lí nhanh nhất thì nên dùng giao tiếp nào ? (1 to n)
b. Nếu mình muốn truyền dữ liệu từ nhiều vi xử lí tới một vi xử lí nhanh nhất thì nên dùng giao tiếp nào ? (n to 1)
c. Nếu mình muốn truyền dữ liệu giữa các vi xử lí với nhau một cách nhanh nhất thì nên dùng giao tiếp nào ? ( ví dụ truyền giữ 2 con bất kì với nhau trong n con vi xử lí)
d. Vẫn câu hỏi như a,b,c nhưng kèm theo điều kiện là ít có lỗi nhất.

Một câu hỏi hơi lang mang xin các bạn thông cảm.

laiquangtuyen
21-07-2009, 09:25 PM
SPI thì có tốc độ cao hơn I2C > UART
đường truyền của CAN thì xa khoảng vài trăm mét, còn UART khoảng 12 mét theo lý thuyết
còn SPI hay I2C thì chỉ truyền trong mạch thôi chứ không truyền xa.
nếu muốn truyền xa thì dùng CAN (chỉ với 2 dây)
nếu muốn giao tiếp với các vi điều khiển với nhau thì chỉ còn xét khaỏng cách thôi:
+ có người dùng CAN (mạng trong nhà thông minh dựa trên nền tảng của nó, công nghiệp thì dùng 485 (UART)) đó là khaỏng cách xa
+ còn có thể dung I2C hoặc SPI đều được, cái nào dễ thì xài, nếu chưa yêu cầu tốc độ vì SPI có tốc độ cao hơn I2C nếu bạn truyền trong mạch
ít lỗi phát sinh hả, cái này còn tùy lập trình chứ sao biết được, nếu truyền xa mà dùng uart thì có khả năng xung đột địa chỉ (485), nên dùng can thì hay hơn.
Còn trong mạch hả có thể dùng I2C hay SPI tùy, còn riêng mình thì trong mạch mình dùng I2C vì dễ làm hơn, mình dùng nhiều thiết bị nối chung vô một mạng I2C mà.
chỉ biết tới đó thôi, có gì thì trao đổi thêm.

bbaacc01
21-07-2009, 10:21 PM
Không biết SPI , I2C có cơ chế nào để tự phát hiện lỗi và tự xử lí không?
Giả sử mình muốn truyền từ vi xử lí 1 đến đồng thời 2 vi xử lí 2 và 3(trên cùng một mạch). Ví dụ yêu cầu là một giây truyền từ vxl 1 đến vxl 2 1024 byte và từ vxl1 đến vxl 3 cũng là 1024 byte. Vậy tốc độ truyền của hệ thống dùng I2C, SPI khoảng bao nhiêu thì đạt được yêu cầu.
Sao mình đọc datasheet của các dspic33F đều không thấy nói là tốc độ truyền tối đa là bao nhiêu cả, có bạn nào biết thông tin này xin chỉ cho mình biết với.
Thank mọi người.

hopeman
22-07-2009, 03:48 PM
Mình đã dùng cả CAN, I2C , SPI và UART. mình xin có một ý kiến nhỏ như sau:
về mặt tốc độ truyền đơn công (1 chiều ): spi>Can>i2c>uart
về mạng ngang hàng (tất cả các nut đều có quyền truyền nhận như nhau ) : chỉ CAN làm được việc này
Về truyền 2 chiều, chủ động ( tức là cả 2 đều có thể chủ động truyền nhận ) : CAN và UART , uart là song công còn CAN là bán song công
i2c và spi theo mô hình master và slaver nên chỉ có 1 thằng chủ động điều khiển cả mạng
Truyền xa và kháng nhiễu mạnh : CAN là vô địch rồi đến em UART, 2 em i2c và spi thì quên đi, nhiều thôi rồi luôn
khả năng cách ly giữa các nút ( ko phải chung đất, ko lo nhiều xung sang nhau v ..v) : chỉ có CAN.
quảng cáo giêng : thực ra em CAN rất tuyệt, hiện giờ mình chơi với mỗi em CAN thôi , mấy em kia chia tay hết rồi :D

hopeman
22-07-2009, 03:53 PM
Không biết SPI , I2C có cơ chế nào để tự phát hiện lỗi và tự xử lí không?
Giả sử mình muốn truyền từ vi xử lí 1 đến đồng thời 2 vi xử lí 2 và 3(trên cùng một mạch). Ví dụ yêu cầu là một giây truyền từ vxl 1 đến vxl 2 1024 byte và từ vxl1 đến vxl 3 cũng là 1024 byte. Vậy tốc độ truyền của hệ thống dùng I2C, SPI khoảng bao nhiêu thì đạt được yêu cầu.
Sao mình đọc datasheet của các dspic33F đều không thấy nói là tốc độ truyền tối đa là bao nhiêu cả, có bạn nào biết thông tin này xin chỉ cho mình biết với.
Thank mọi người.

trong datasheet của tất cả các vi xử lý đều nói đến baud rate của việc truyền i2c và spi , đây chính là tốc độ bit/s của việc truyền nhận này luôn, tuy nhiên đây ko thực sự phản ánh tốc độ truyền dữ liệu có ích của bạn vì nó còn phụ thuộc vào giao thức mềm và giao thức cứng bạn chọn, trong đó có thể 1 khung truyền bạn sẽ mất một số bit cho những việc khác thay vì dữ liệu.

laiquangtuyen
22-07-2009, 09:06 PM
Đúng rồi đó!

longthophi
28-05-2011, 10:17 AM
bác hopeman ơi. em đang làm một project đo nhiệt độ ở một vị trí và truyền dữ liệu về một con vdk khác ở một khoảng cách 50 m. nếu em dùng spi thì có thiết bị nào hỗ trợ cho spi chuyền xa không?

dinhnambkhn
09-09-2011, 09:29 PM
neu ban muon lam project do nhiet do truyen xa gom nhieu node!thi theo to nen dung dong CCxx cua TI,con nay ho tro manh cho truyen thong zigbee.tot da co the len tot 256 node trong mang.neu quan tam ban nen vao webside cua TI tim hieu!

tan_truong
17-10-2011, 09:48 AM
Chào cả nhà,
Nhờ mấy anh em so sánh dùm mình khoảng cách truyền nhận dự liệu giữa mạng I2C với CAN với.
Cảm ơn mọi nguời

tap_tanh
03-01-2012, 10:50 PM
về mạng ngang hàng (tất cả các nut đều có quyền truyền nhận như nhau ) : chỉ CAN làm được việc này
:D

Mình có ý kiến về vụ này, I2C vẫn làm được chuyện này mà, cùng là MultiMaster thôi, các bác coi đúng kg?