Một nô lệ SPI có thể bắt đầu truyền trong chế độ song công hoàn toàn không?


8

Theo như tôi biết, việc truyền SPI cho một nô lệ SPI hoạt động như dưới đây:

  1. Master chọn nô lệ bằng pin SS
  2. Master và nô lệ gửi dữ liệu cho nhau
  3. Master bắt đầu đồng hồ và truyền dữ liệu cùng một lúc (không có đồng hồ trước khi hoạt động ghi)
  4. Master dừng truyền bất cứ lúc nào nó muốn (bằng cách dừng hoạt động ghi và tạo đồng hồ), ngay cả khi nô lệ có nhiều dữ liệu để gửi.

Có cấu hình nô lệ SPI nào cho phép nô lệ truyền dữ liệu mà không cần sự cho phép của chủ không?

Tôi chỉ đang suy nghĩ thành tiếng. Giả sử rằng chỉ có một nô lệ và đồng hồ liên tục được cung cấp bởi chủ, v.v.

Ngay cả khi câu lệnh giả định là đúng, không chủ và nô lệ mất đồng bộ hóa byte (tức là nhận luồng bit) vì không có bit start-stop cho SPI?

Tôi đang hỏi một câu hỏi như vậy bởi vì tôi đã đọc phần sau từ tài liệu này .

2.2 Ví dụ SPI

Ví dụ SPI đính kèm minh họa việc sử dụng USART ở chế độ đồng bộ. USART1 được cấu hình là nô lệ, trong khi USART2 là chủ. Các giao dịch sau đây diễn ra:

  • Truyền dữ liệu từ chủ đến nô lệ.
  • Truyền dữ liệu từ nô lệ đến chủ.
  • Truyền dữ liệu từ chủ sang nô lệ và từ nô lệ sang chủ đồng thời.

Tài liệu đưa ra ví dụ SPI nhưng nhận ra ví dụ sử dụng các thiết bị USART. Và tôi nhận được rằng một nô lệ USART có thể bắt đầu truyền mà không cần sự cho phép của chủ nhân.

Tôi không thể tìm thấy mã nguồn được tài liệu tham chiếu.


4
Theo định nghĩa, nô lệ không thể bắt đầu một giao dịch (nó có thể làm gián đoạn chủ để bắt đầu một giao dịch).
Peter Smith

5
Truyền dữ liệu đơn hướng trong SPI truyền thống chỉ là một người bỏ qua trạng thái của dòng đi theo hướng khác. Viết, đọc và chuyển hai chiều không thực sự khác biệt. Trong thực tế, ví dụ, nhiều thiết bị ngoại vi SPI sẽ phát hiện ra một từ trạng thái trong từ đầu tiên, trước khi họ biết những gì đang được yêu cầu, vì chi phí bên cạnh không có gì để làm như vậy và cho phép bỏ phiếu nhanh.
Chris Stratton

Câu trả lời:


17

Không, với SPI, tất cả các giao tiếp được điều khiển bởi thiết bị chính. Bạn đúng là chủ không thể đơn giản cung cấp đồng hồ liên tục; sẽ không có cách nào để phát hiện các ranh giới byte.

Một thiết bị nô lệ thường sẽ có một chân đầu ra riêng biệt để báo hiệu cho chủ rằng nó có sẵn dữ liệu. Chân này được kết nối với đầu vào trên vi điều khiển và thường được sử dụng làm ngắt.

Sau đó, thiết bị có thể xác nhận pin, khiến vi điều khiển quay bus SPI.


Để biết thêm thông tin chi tiết, xin vui lòng đọc tiếp :) Đây là phiên bản sửa đổi một chút của một lời giải thích được tìm thấy ở đây :

Thiết bị nô lệ chỉ có thể giao tiếp khi được cung cấp đồng hồ từ chủ. Điều này làm phức tạp việc đọc từ nô lệ, bởi vì bạn phải khiến chủ cung cấp đủ chu kỳ đồng hồ để nô lệ phản hồi.

Khi bạn gửi lệnh SPI từ chủ, hai lần truyền thực sự xảy ra trong cùng tám xung đồng hồ. Đầu tiên là byte của bạn được đặt ngoài dòng MOSI. Nhưng, đồng thời, dữ liệu đang được đưa vào vi điều khiển thông qua dòng MISO.

Nhưng vì nô lệ không nhận được lệnh đầy đủ cho đến khi kết thúc các giao dịch này, nên nó không xuất hiện bất kỳ dữ liệu nào cho xe buýt. Điều này dẫn đến giá trị nhận được là 0x00 hoặc 0xFF.

Sau đó, bạn cần cung cấp thêm tám đồng hồ để cho phép nô lệ trả về giá trị thực. Trong nhiều triển khai mã, điều này được thực hiện bằng cách gửi "byte giả" cho nô lệ.

Lưu ý rằng, trong lần truyền đầu tiên, chủ sẽ bỏ qua mọi thứ đến từ nô lệ. Trong lần truyền thứ hai, nô lệ bỏ qua bất cứ thứ gì được gửi bởi chủ.

Điều đó mô tả trường hợp chung. Có thể có thêm phức tạp. Ví dụ, một số IC nô lệ thực sự sẽ xuất ra một số loại byte trạng thái cùng lúc chúng nhận được lệnh từ chủ. Vì vậy, trong trường hợp này, chủ không nên loại bỏ byte nhận được đầu tiên.


2
"Bậc thầy không thể đơn giản cung cấp đồng hồ liên tục" Thực ra tôi đã thấy một thiết bị cách đây không lâu, chính xác là như vậy. Đó là một con thú nhỏ kỳ lạ. Tôi không nhớ P / N thật không may.
Aaron

@Aaron Tốt để biết! Mọi người ngày càng thông minh hơn :-)
bitsmack

7

Không, chủ nhân là người phân xử chip và chọn đồng hồ. Một nô lệ sẽ luôn chỉ nghe đồng hồ và chipelect. Truyền dữ liệu có thể được song công hoàn toàn. Có một số triển khai trong đó đồng hồ có thể liên tục, nhưng nó không quan trọng lắm vì chipelect được sử dụng để đồng bộ hóa các ranh giới byte. Nhưng sau đó, có các hệ thống multimaster, vì vậy về cơ bản, bạn có thể có một số cơ chế để các thiết bị quyết định ai là nô lệ và chủ. Hoặc chỉ bao gồm một dây "ngắt" riêng cho nô lệ để báo hiệu cho chủ rằng nó có gói dữ liệu cho chủ.


Bạn có thể thêm một ví dụ về một hệ thống multimaster?
davidcary
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.