Ngắt UART TX để làm gì?


8

Tôi biết rằng ngắt RX rõ ràng được sử dụng để lưu phiếu bầu, nhưng tại sao TX cũng vậy?


3
Lý do tương tự. Bạn thường gửi một tin nhắn dài một nhân vật tại một thời điểm.
Brian Drumond

1
Mã cần phải làm rất ít khác có thể chặn trên truyền thực tế. Mã hiệu quả hơn có thể thoát bộ đệm phần mềm trong ngắt. Tuy nhiên, mã phức tạp hơn trên phần cứng hỗ trợ nó có thể thiết lập một công cụ DMA để bơm chuyển mà không làm phân tâm CPU khỏi công việc quan trọng hơn, mặc dù tốc độ truyền nối tiếp thường khá chậm trong các điều khoản MCU có thể không phải lúc nào cũng quan trọng.
Chris Stratton

3
Nếu bạn đang hỏi về ngắt UART TX trên một loại thiết bị cụ thể, thì vui lòng gửi một liên kết đến biểu dữ liệu của nó.
Nick Alexeev

Ngắt mà những người khác đã đề cập đến các tín hiệu rằng có không gian bộ đệm có sẵn trong uart để truyền dữ liệu nhiều hơn. Bộ đệm có thể có một hoặc nhiều byte chiều dài tùy thuộc vào phần cứng uart. Thường có một ngắt "chuyển hoàn thành" khác nhau báo hiệu rằng tất cả các bit đã được chuyển ra khỏi uart. Điều này có thể được sử dụng cho các mục đích khác như chuyển đổi bộ thu phát từ truyền sang nhận.
Tut

Câu trả lời:


7

Mục tiêu chính của ngắt TX (thực sự là END OF TX) là tự động gửi nội dung của bộ đệm (nhiều byte). Khi được thực hiện một cách thích hợp:

  1. Cho phép ngắt TX.
  2. Mã người dùng bắt đầu truyền bằng cách chỉ gửi byte đầu tiên trong bộ đệm.
  3. Ở cuối TX (của byte đầu tiên), một ngắt sẽ được tạo.
  4. Trong TX ISR (Routine Service Routine), mã phải gửi byte tiếp theo trong bộ đệm và cập nhật chỉ số bộ đệm.
  5. Vào cuối quá trình truyền này, một ngắt mới xảy ra, và cứ thế, cho đến khi toàn bộ nội dung của bộ đệm được gửi "tự động".
  6. Vô hiệu hóa ngắt TX.

Các hành vi chính xác phụ thuộc vào vi điều khiển. Đó là một mô tả chung.


4
Một đơn giản hóa dễ dàng trên nhiều nền tảng là để mã người dùng chỉ chịu trách nhiệm đưa dữ liệu vào bộ đệm và cho phép ngắt; ISR vô hiệu hóa ngắt nếu nó kích hoạt khi bộ đệm khô.
supercat

8

Ngắt TX chủ yếu là cho các datagram dài hơn. Bạn có thể bắt đầu chuyển cho một bộ đệm có độ dài đã biết (bytecount). Bây giờ bạn có thể đẩy con trỏ bộ đệm của mình thường xuyên như có byte để gửi, khi ngắt TX xảy ra. Điều này đảm bảo việc chuyển bộ đệm "càng nhanh càng tốt" mà không cần phải thăm dò bất kỳ "TransferComplete" -Flag / Statusbit nào.


2

Một số UARTS có bộ đệm bên trong lớn hơn một, sê-ri 16xxx cho một.

Thủ tục ở đây là

  1. Đặt mặt nạ cửa sổ truyền, ví dụ như 4 còn lại.
  2. điền vào các vị trí bộ đệm cho đến khi UART cho biết đầy đủ hoặc không cần gửi thêm dữ liệu
  3. làm những việc khác
  4. khi chỉ còn lại 4 vị trí bộ đệm, đặt ngắt TX
  5. chờ ngắt để được phục vụ
  6. nếu cần thêm dữ liệu, hãy chuyển đến 2.

Điều này làm giảm tải CPU bằng cách giảm tải một số xử lý cho UART, do đó cho phép CPU chậm hơn để theo kịp và phục vụ các nhiệm vụ khác thay vì luôn bị gián đoạn.


2

Ngắt TX kích hoạt khi có không gian trong bộ đệm truyền.

Đối với các thiết bị không có bộ đệm truyền (tức là nơi bạn ghi một byte, được truyền ngay lập tức), ngắt được xác nhận khi thanh ghi truyền có thể được ghi bằng byte kế tiếp.

Đối với các thiết bị có bộ đệm, ngắt được xác nhận tại thời điểm xác định thực hiện. Đối với một số người, đó là khi bộ đệm trống một nửa, đối với một số người là khi việc truyền byte cuối cùng đã bắt đầu và bộ đệm hoàn toàn trống rỗng.


0

Một trường hợp sử dụng khác là khi bạn kết nối UART với một giao diện truyền thông khác như RS485. Bộ điều khiển phải giải phóng trình điều khiển bus ngay khi bit cuối cùng được chuyển ra khỏi bộ đệm TX. Điều này rất dễ xử lý trong ngắt TX, nhưng sẽ khó thực hiện nếu không có thời gian chính xác sau khi ghi byte cuối cùng vào bộ đệm đầu ra cũng thay đổi theo tốc độ truyền.


Việc sử dụng RS485 hoạt động tốt nhất nếu có sẵn ngắt truyền hoàn toàn thay vì chỉ có sẵn bộ đệm truyền. Đặc biệt trên các thiết bị có bộ đệm lớn, cách duy nhất để bị gián đoạn sau khi byte hữu ích cuối cùng được gửi là cung cấp cho các byte bổ sung không mong muốn của UART và hy vọng người ta có thể vô hiệu hóa việc truyền trước khi chúng bị tắt.
supercat

@supercat: Bạn thực sự đúng khi chỉ ra rằng điều này sẽ yêu cầu ngắt hoàn toàn Tx . Nhưng tôi nghĩ rằng điều này vẫn liên quan đến câu hỏi.
Rev1.0

Bạn thường có thể nhận được chỉ bằng một ngắt có sẵn bộ đệm, nhưng ngắt hoàn toàn tx thường tốt hơn; Tôi đã nghĩ rằng có thể hữu ích để khuếch đại lý do tại sao một số UART có các ngắt riêng biệt để sẵn sàng cho bộ đệm và truyền hoàn tất.
supercat
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.