Giao thức chung để truyền dữ liệu từ hệ thống này sang hệ thống khác?


18

Giao thức chung để gửi thông tin từ hệ thống này sang hệ thống khác là gì? Ví dụ: giả sử chúng tôi có một số thông tin được thu thập từ vi điều khiển trong một khoảng thời gian mà chúng tôi muốn gửi đến một vi điều khiển khác. Tôi đã nghe nói về giao diện SPI và I2C, nhưng tôi không rõ khi nào bạn sử dụng một phương thức này so với phương thức khác và cách bạn triển khai nó. Có phương pháp nào khác ngoài SPI và I2C là phổ biến không? Là quá trình thực hiện tương tự cho các vi điều khiển khác nhau? Có phải về cơ bản là phân tích cú pháp byte dữ liệu mà tôi đang làm trên vi điều khiển nhận không?


4
Điều cụ thể bạn muốn làm là gì?
starblue

Chỉ cần nghĩ làm thế nào để có được các phần khác nhau của một hệ thống để truyền dữ liệu cho nhau trong một hộp nhỏ, do đó khoảng cách có thể được giả định là rất ngắn. Lý do để có các phần khác nhau trong một hộp là để đơn giản hóa các chức năng sao cho mỗi phần có chức năng riêng (hy vọng điều đó có ý nghĩa ..)
O_O

2
đó không phải là những gì mọi người thường gọi là một hệ thống. Đó là nhiều hơn những gì tôi sẽ định nghĩa là hệ thống phụ. Chúng tạo thành một phần của những gì bạn có thể xem xét một hệ thống hoàn thành một nhóm nhiệm vụ. Đó là ngữ nghĩa, nhưng tôi nghĩ rằng nhiều câu trả lời của bạn rất rộng vì họ không có ý tưởng hoàn hảo về những gì bạn đang tìm kiếm từ câu hỏi.
Kortuk

1
dọc theo những gì Kortuk nói, nó giúp xác định vấn đề. Một câu hỏi quan trọng để tự hỏi mình là liệu bạn có thể có ý định thay thế các hệ thống con riêng lẻ bằng các triển khai khác nhau của cùng một chức năng hay không, nếu đây là thiết kế một lần như hiện tại. Nếu bạn sử dụng một chiếc xe buýt thực sự và tiết lộ chi tiết triển khai của các hệ thống con cho cpu của bạn, thì một thay đổi hệ thống con yêu cầu thay đổi / w cho bộ điều khiển của bạn, trong khi nếu bạn sử dụng giao diện truyền thông, thì việc bạn triển khai (thay thế như thế nào) ) hệ thống con, miễn là nó đáp ứng cùng một giao thức tin nhắn.
JustJeff

Không đơn giản hơn để phân chia chức năng trên nhiều thiết bị không vì lý do nào khác ngoài việc phân tách các tác vụ. Truyền thông và đồng bộ hóa phức tạp hơn so với việc có hai quá trình trong cùng một vi mô. Bây giờ, nếu các quy trình này có hồ sơ độ trễ đặc biệt không tương thích (một phải nhanh chóng cập nhật trong khi quá trình kia có thể mất một chút thời gian để hoàn thành một đoạn), thì có thể có một lý do hợp lệ để phân tách chúng. Thậm chí sau đó, giải pháp phổ biến hơn là sử dụng các ngắt hoặc tìm cách phá vỡ nhiệm vụ dài hơn xuống hơn nữa. Với những gì bạn đã mô tả, tôi đang nghiêng về suy nghĩ, bạn nên suy nghĩ lại về điều này.
darron

Câu trả lời:


10

SPI và I2C giống nhau, ở chỗ chúng thực sự được sử dụng nhiều hơn để gắn các thiết bị ngoại vi vào bộ điều khiển hoặc cpu, hơn là thực sự truyền dữ liệu giữa các hệ thống. USB là một giao diện khác mà mọi người dường như muốn coi là một hệ thống truyền thông, trên thực tế là một bus đính kèm ngoại vi.

Giao tiếp giữa các hệ thống không chính xác như gắn thiết bị vào xe buýt. Đính kèm bus cho phép bộ xử lý đập trực tiếp vào các thanh ghi trong thiết bị, trong khi giao diện giao tiếp cho phép bạn gửi / nhận luồng dữ liệu. Một thiết bị được kết nối trên xe buýt thường cần một trình điều khiển thiết bị, trong khi với truyền thông, thực sự không có vấn đề được kết nối ở đầu bên kia, liên quan đến máy tính chủ.

Tất nhiên, điều này đang trở thành một ranh giới nguy hiểm hơn mọi lúc. Những thứ như PCI và ISA là xe buýt không thể chối cãi; I2C, SPI, USB là những chiếc xe buýt được cho là; trong khi đó, RS232, RS485 và ethernet chắc chắn là các giao diện truyền thông. Nhưng sau đó, có những thứ như CAN bus và 1553, chắc chắn là về việc di chuyển dữ liệu xung quanh, nhưng theo một cách rất liên quan.


CANbus có liên quan rất nhiều, còn ethernet thì không? CAN rất đơn giản để làm việc cho tin nhắn qua lại đơn giản. Chúng là những con chip chuyên dụng và hầu hết các gia đình đều hỗ trợ bộ điều khiển vi mô của chúng.
Kortuk

@Kortuk - trong chừng mực như một thứ như 232 có một kiểu đối xứng ngang hàng, trong khi 1553 hoặc CÓ THỂ áp đặt mối quan hệ chủ / nô lệ, vâng. Tôi không tin rằng tôi đã nói rằng ethernet rất đơn giản, chỉ là nó không áp đặt sự khác biệt của bộ điều khiển xe buýt / thiết bị xe buýt ở các điểm cuối.
JustJeff

Ngoài ra, công bố đầy đủ - ý kiến ​​của tôi về CAN hoàn toàn từ tiếp xúc tiếp tuyến; nó đã là một thiết bị ngoại vi tùy chọn không được sử dụng trên một số hệ thống mà tôi đã làm việc, nhưng sau hàng trăm lần lướt qua tài liệu, bạn tiếp thu một chút về các tùy chọn không sử dụng chỉ bằng thẩm thấu. Vì vậy, tôi đang làm việc theo giả định rằng CAN là loại kiến ​​trúc điều khiển / thiết bị được điều khiển.
JustJeff

Tôi nghĩ rằng xe buýt có ý nghĩa khác nhau trong các bối cảnh khác nhau. Từ cấp độ sơ đồ, bất kỳ giao diện có nhiều tín hiệu có thể được coi là một chiếc xe buýt. Khi bạn di chuyển đến cấp độ cao hơn với sự trừu tượng hơn, xe buýt sẽ thay đổi ý nghĩa. Cao hơn một chút, xe buýt thường có nghĩa là có hoặc có thể có nhiều thiết bị tham gia. Ví dụ, đa điểm RS485 chắc chắn là một chiếc xe buýt. Cao hơn nhiều, từ quan điểm của thiết bị Linux, RS485 trở lại giao diện comm và bị hạ cấp thành xe buýt ... cho đến khi bạn thêm lớp giao thức của riêng mình lên trên nó biến nó trở lại thành xe buýt. Ở mỗi cấp độ có ý nghĩa khác nhau.
darron

11

Không có cách nào để gửi dữ liệu, có nhiều cách khác nhau để giao tiếp tùy thuộc vào khoảng cách, tốc độ dữ liệu, môi trường, ứng dụng ...

Lớp thấp nhất là lớp vật lý , thực sự di chuyển các bit xung quanh.

  • SPI và I²C dành cho khoảng cách ngắn bên trong thiết bị, nơi không có nhiều tiếng ồn có thể làm phiền việc truyền tải.

  • Đối với giao tiếp không quá nhanh qua khoảng cách lên đến vài chục mét, giao tiếp nối tiếp qua RS-232 là một lựa chọn tốt.

  • Nếu có nhiều nhiễu hoặc tín hiệu chênh lệch khoảng cách dài hơn được sử dụng, ví dụ trong RS-485. Để truyền dữ liệu nhanh hơn, có Ethernet, ngày càng trở nên phổ biến.

  • Sau đó, cũng có các tiêu chuẩn không dây khác nhau.

Trên đầu lớp vật lý có nhiều lớp tổ chức cách gửi dữ liệu, để phát hiện và sửa lỗi trong quá trình truyền, định tuyến trong mạng và nhiều thứ khác. Ví dụ, giao thức internet là một chồng khá phức tạp của một số lớp, thường là trên giao thức Ethernet.


7

Một UART nối tiếp đơn giản có thể được sử dụng (một dòng Tx và một dòng Rx không có đồng hồ rời) và có thể dễ dàng điều chỉnh để giao thoa giữa các tiềm năng khác nhau (ngay cả mạch sơ cấp và thứ cấp) với bộ tách quang hoặc bộ cách ly từ tính .

Theo như các giao thức, bất cứ thứ gì có byte lệnh được xác định và một số loại sơ đồ tổng kiểm tra sẽ hoạt động tốt. Thực sự không có một giao thức chuẩn bao gồm tất cả các loại giao tiếp. I2C có một tiêu chuẩn báo hiệu (xác định địa chỉ, dừng, bắt đầu, v.v.) nhưng giao thức của những gì thực sự được truyền đạt chỉ phụ thuộc vào nhà phát triển.

PMBus , ví dụ, là một giao thức truyền thông cung cấp điện sử dụng I2C làm phương tiện vật lý.


6

Thực sự không có giao thức "chung", những gì bạn kết thúc sử dụng phụ thuộc nhiều vào ứng dụng. Để chúng tôi cung cấp cho bạn câu trả lời tốt hơn, chúng tôi cần hiểu rõ hơn các yêu cầu của bạn. Bạn đề cập rằng bạn muốn có các bộ điều khiển vi mô riêng biệt nói chuyện với nhau như các hệ thống con.

Một số câu hỏi về ứng dụng này:

  1. Sẽ có nhiều hơn 2 bộ điều khiển vi mô trong dự án này?
  2. Yêu cầu tốc độ và thông lượng của bạn là gì? Làm thế nào nhanh chóng thông tin cần đến đó và tần suất bạn gửi / nhận dữ liệu?

Nếu bạn trả lời KHÔNG cho câu hỏi 1:

Nếu chỉ có 2 micrco-điều khiển trong dự án này, bạn chắc chắn có thể sử dụng UART giữa chúng. Nếu cả hai đều cần bắt đầu liên lạc, hãy sử dụng điều khiển luồng, nếu không thì việc gửi dữ liệu theo một hướng là chuyện nhỏ. Đối với hầu hết các phần nên là "đủ nhanh" khi bạn chọn một trong những tốc độ truyền cao hơn. I2C và SPI thường chỉ tốt cho kiến ​​trúc chủ / nô lệ.

Nếu bạn trả lời CÓ (hơn 2 bộ điều khiển) cho câu hỏi 1:

  • Nếu có nhiều hơn 2 bộ điều khiển vi mô trong dự án của bạn, cái nào sẽ bắt đầu truyền thông? Nó sẽ chỉ là một bộ điều khiển chính (tức là kiến ​​trúc chủ-nô)? Hoặc bất kỳ hệ thống con nào có thể nói bất cứ lúc nào?
  • Có cần cho bất kỳ hệ thống con nào để nói chuyện với nhau không? ví dụ: đối với thiết bị A, B và C: A có thể gửi đến B và C và B có thể gửi cho cả A và C, v.v.

Vì vậy, bây giờ bạn cần một cái gì đó có khả năng mở rộng hơn, nơi bạn có thể thả các thiết bị có địa chỉ lên một chiếc xe buýt chung. Câu trả lời cho những câu hỏi tiếp theo này sẽ giúp bạn quyết định giữa I2C và SPI (chủ nô) hoặc đại loại như CAN (đa chủ).

Bộ điều khiển vi mô của bạn rất có thể có thiết bị ngoại vi UART, các bộ điều khiển khác (đặc biệt là CAN) chỉ có thể khả dụng trên các chip cao cấp hơn. Trong cả hai trường hợp, cần có nhiều tài liệu về cách sử dụng các thiết bị ngoại vi này để di chuyển byte xung quanh.


5

Như @Jon đã lưu ý, một vấn đề trong việc chọn giao diện truyền thông là liệu một thực thể sẽ luôn chịu trách nhiệm bắt đầu truyền thông hay liệu có nhiều hơn một thực thể có thể chịu trách nhiệm như vậy hay không. Một vấn đề liên quan là liệu một thực thể sẽ luôn sẵn sàng nhận thông tin liên lạc không mong muốn. SPI thường được sử dụng trong các ứng dụng mà một bên sẽ luôn sẵn sàng nhận thông tin liên lạc. Ví dụ, một cái gì đó như một thanh ghi thay đổi 74HC595 không bao giờ "bận". Mặc dù SPI tốt cho giao tiếp giữa vi điều khiển và phần cứng mà vi mô được cho là điều khiển, nhưng nó thực sự không tốt cho giao tiếp giữa hai vi điều khiển. Khi hai bộ xử lý có phần cứng I2C đang sử dụng nó để liên lạc, phần mềm có thể mất bao lâu tùy thích (trong các ràng buộc rất hào phóng) để đối phó với những gì đang diễn ra, mà không gây mất dữ liệu. Nếu một bộ xử lý phải mất 100 micro giây để xử lý mỗi byte đến, điều đó sẽ hạn chế nghiêm trọng thông lượng, nhưng người gửi sẽ làm chậm đủ để người nhận theo kịp. Cách duy nhất thường có thể xảy ra với SPI là nếu một người có một dây riêng để bắt tay.

I2C thực sự là một giao thức tuyệt vời. Những hạn chế lớn nhất ngăn không cho nó trở thành giao thức hoàn hảo nhất có thể tưởng tượng được là

  1. Tốc độ của nó có phần hạn chế; SPI có thể đi nhanh hơn nhiều và thậm chí UART đôi khi có thể đi nhanh hơn một chút
  2. (2) Mặc dù rất thuận tiện khi I2C chỉ cần hai dây, cả hai dây phải có khả năng giao tiếp bộ thu mở hai chiều. Điều này gây khó khăn cho việc gửi I2C qua các bộ lặp.

Cá nhân, tôi muốn thấy những người bán bộ điều khiển hỗ trợ một biến thể SPI ba dây bao gồm bắt tay. Tôi không biết về bất kỳ bộ điều khiển nào làm như vậy, mặc dù.


Thật buồn cười, bạn nên đề cập đến điều này ... Tôi phải biến giao diện SPI thành giao diện I2C không hai chiều (byte đầu tiên là một địa chỉ) để cho phép nhiều thiết bị tham gia trên xe buýt hơn tôi chọn chip . Nó hoạt động nếu các thiết bị nô lệ của bạn là tất cả các FPGA. :) Tôi cũng muốn có một cái gì đó ở giữa hai tiêu chuẩn đồng bộ chính đó.
darron

Ồ, tôi đoán tôi nên làm rõ rằng đầu ra cho phép các nô lệ không được xác nhận cho đến khi nhận được địa chỉ byte và chúng vẫn tồn tại cho đến khi lựa chọn chip đơn lẻ được xác nhận lại ... vì vậy rõ ràng nó hơi khác so với mức cao SPI + bình thường giao thức. Tuy nhiên, nó hoàn toàn tương thích với SPI tiêu chuẩn từ quan điểm của thiết bị chính. (giống như một bộ vi xử lý)
darron

@darron: Tuyệt. Tôi tự hỏi điều gì sẽ xảy ra cho ngành công nghiệp để bắt đầu sử dụng một xe buýt truyền thông ba dây tiêu chuẩn mở trong đó các dây dẫn được điều khiển cao và thấp? Tôi đoán rằng có một mâu thuẫn nhỏ giữa việc tránh kéo lên thụ động và cho phép bất kỳ thiết bị nào phát tín hiệu ngắt, mặc dù điều đó có thể được khắc phục bằng cách thêm một chốt ngắt có thể được nối với chủ hoặc không thuận tiện cho nô lệ (triển khai hiện tại của tôi giao thức chỉ có một nô lệ, vì vậy nó có thể sử dụng dây trả về dữ liệu để báo hiệu không đồng bộ khi muốn được bảo trì).
supercat

@darron: Để tránh phải sử dụng pin chọn chip, tín hiệu chính bắt đầu bằng cách gửi hai cạnh tăng trên dây dữ liệu trong khi xung nhịp thấp; nô lệ có thể cho biết liệu byte dữ liệu cuối cùng của họ có hợp lệ hay không bằng cách xuất ra một giá trị trạng thái khi đồng hồ và dữ liệu đều ở mức thấp (không hoạt động); mặt khác, họ chỉ ra rằng họ muốn sự chú ý khi đồng hồ thấp và dữ liệu cao. Nếu tôi được thiết kế phần cứng tổng thể cho giao thức này, tôi sẽ thêm khả năng gửi 8 đồng hồ xung nơi dây dữ liệu nhân đôi đồng hồ, và trong phần cứng nô lệ bao gồm một số lượng không đồng bộ của số cạnh tăng trong ...
supercat

@darron: ... một byte dữ liệu. Nếu năm hoặc lớn hơn, byte sẽ bị bỏ qua (nô lệ sẽ cho rằng chủ nhân quan tâm đến việc nhận một byte dữ liệu, nhưng không có gì thực sự muốn nói). Tuy nhiên, điều đó sẽ không quan trọng bằng việc nô lệ báo cáo trạng thái byte cuối cùng khi đồng hồ ở mức thấp (điều này sẽ xảy ra, nếu thiết bị nô lệ là bộ xử lý, cho phép chủ nhân biết rằng nô lệ đã sẵn sàng và đã bỏ lỡ 'cơ hội giao dịch' cuối cùng.
supercat

3

Không theo thứ tự cụ thể, các thể hiện lớp vật lý phổ biến nhất cho 2 CPU trong cùng một hộp dường như là:

  • SPI chuỗi daisy (như được sử dụng bởi JTAG)
  • SPI chọn dây cho mỗi nô lệ
  • "RS-232 cấp độ TTL" hay còn gọi là "giao tiếp nối tiếp bắt đầu không đồng bộ" (kết nối trực tiếp chân UART TX của một CPU với chân UART RX của CPU khác)
  • I2C
  • Dữ liệu 8 bit + nhấp nháy (chẳng hạn như cổng song song cổng máy in IEEE 1284)
  • bộ nhớ dùng chung (chỉ một CPU điều khiển bus địa chỉ / dữ liệu / điều khiển tại một thời điểm)

Các thể hiện của lớp vật lý này (cũng như các thể hiện của lớp vật lý khác cho 2 CPU trong các hộp riêng biệt) thường cung cấp một luồng byte cho phần mềm thực hiện các mức cao hơn của hệ thống truyền thông.

Các lập trình viên thông minh viết phần mềm theo cách mà khi anh chàng phần cứng quyết định xé một thể hiện của lớp vật lý và thay thế nó bằng một thể hiện của lớp vật lý hoàn toàn khác, họ chỉ cần viết lại một vài chức năng để cung cấp luồng byte đầu ra của họ đến phần cứng và đọc lại một luồng byte từ phần cứng và tất cả các công cụ giao thức cấp cao hơn tiếp tục hoạt động không thay đổi.

Giao thức gửi thông tin từ CPU này sang CPU khác hầu như luôn liên quan đến việc diễn giải luồng byte dưới dạng một chuỗi các gói:

  1. lời mở đầu
  2. tiêu đề
  3. (có thể thoát) dữ liệu tuần tự
  4. trailer

Một số người dường như thích tạo ra các giao thức hoàn toàn mới, tùy chỉnh, không tương thích bằng cách trộn và kết hợp (2) một trong nhiều loại cấu trúc tiêu đề với (3a) một trong nhiều loại dữ liệu tuần tự hóa với (3b) một trong nhiều loại thoát khỏi dữ liệu nối tiếp đó với (4) một trong nhiều loại trailer.

Một số giao thức đơn giản nhất để đóng gói dữ liệu vào một gói bao gồm:

Các giao thức phức tạp hơn một chút để đóng gói dữ liệu vào một gói bao gồm:

Có một danh sách dài các giao thức tại

Bạn có thể thích đọc "Văn hóa dân gian thiết kế giao thức" của Radia Perlman, mô tả cách thiết kế giao thức có thể sai.


3

Không có giao thức 'chung' duy nhất. Sự lựa chọn có thể (ví dụ) phụ thuộc vào:

  • khoảng cách
  • thông lượng cần thiết
  • sẵn có các thiết bị ngoại vi đặc biệt
  • Mức độ ồn
  • cần cách ly quang
  • mức độ nghiêm trọng (tỷ lệ thất bại chấp nhận được)
  • sức mạnh CPU khả dụng ở cả hai đầu
  • chân I / O có sẵn ở cả hai đầu

Trong nhiều trường hợp, bạn phải loại bỏ lớp vật lý (mức tín hiệu) khỏi lớp liên kết dữ liệu (+/- cách dữ liệu được mã hóa) (kiểm tra mô hình OSI, thấp hơn 2 ..4 lớp). Ví dụ, các lớp thực vật có thể là:

  • 5V 5V đơn giản hoặc 3,3V hoặc thậm chí 1,8V
  • bất kỳ thứ nào ở trên nhưng bộ thu mở thay vì kéo đẩy
  • cân bằng tín hiệu điện áp lov (thường được sử dụng với FPGA)
  • cân bằng higer volatge (RS485, RS432)
  • điện áp cao hơn kết thúc đơn (RS232)
  • cân bằng kết hợp trafo (các phiên bản ethernet khác nhau, âm thanh PDIF)
  • quang (ethernet quang, toslink)

Bạn có thể sử dụng một dòng để mang dữ liệu và thông tin đồng hồ, hoặc chia dòng này thành nhiều dòng. Cái sau được sử dụng phổ biến, nhưng ngày nay hầu hết các giao thức mới / nhanh có xu hướng sử dụng một dòng (hoặc một cặp dòng hoạt động như một).

Có rất nhiều cách để mã hóa dữ liệu và đồng hồ trên một dòng. Theo truyền thống, sử dụng NRZ, có mã hóa Machester, với các định dạng khác nhau được sử dụng trên các đĩa cứng với dòng tên tò mò 2.7 RLL.

Tóm lại: có rất nhiều cách để thực hiện giao tiếp giữa các hệ thống. Và tôi thậm chí không đề cập đến các trình kết nối hoặc các khía cạnh cấp cao hơn như phát hiện và khôi phục lỗi, mã hóa dữ liệu, nén và mã hóa ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.