Tôi không có UART trên vi điều khiển của mình, vậy làm cách nào để thêm?


13

Tôi đang sử dụng một vi điều khiển ATMEGA32HVB có một cơ sở để cân bằng tế bào, nhờ đó chúng ta có thể kết nối 4 pin theo chuỗi và sử dụng từng pin một. Điều đó rất hữu ích cho việc quản lý năng lượng vì vậy tôi không thể sử dụng một vi điều khiển khác. Vui lòng đề xuất một số phương pháp để thêm UART vào nó để tôi có thể dễ dàng giao tiếp với các thiết bị nối tiếp.


11
Cách UART phần mềm như được mô tả bởi user26129 được gọi là bit-banging .
Johan.A

4
Chỉ cần 0,02 đô la rất chủ quan của tôi, nhưng tôi thường thích một bộ điều khiển pin chuyên dụng riêng biệt và UART tích hợp uC thay vì cách khác. Tại sao bạn cần quản lý pin tích hợp trong uC?
Mels

Tôi phải sử dụng pin sạc sẽ được sạc bằng bảng điều khiển năng lượng mặt trời vì vậy tôi cần 4 battries nối tiếp sẽ được sử dụng một lần
dùng27485

4
Một câu hỏi là bạn muốn sử dụng UART bao nhiêu và theo hướng nào. Nếu bạn chỉ muốn tạo một thông báo gỡ lỗi hoặc thông báo trạng thái không thường xuyên, tại thời điểm bộ xử lý của bạn không có nhiều nhu cầu bổ sung, đầu ra nối tiếp bit có thể trông rất hấp dẫn. Có một số dấu hiệu như sử dụng các ngắt thay đổi pin có thể làm giảm tải trung bình của việc có kênh đầu vào, nhưng nếu bạn muốn nhận được các ký tự ở tốc độ truyền cao tại thời điểm bạn có các cam kết thời gian thực khác, thì đó có thể là một vấn đề.
Chris Stratton

Câu trả lời:


17

Như những người khác đã lưu ý, bạn có thể thêm phần cứng bổ sung vào hệ thống của mình để cung cấp chức năng UART hoặc bạn có thể mô phỏng một phần mềm trong phần mềm. Nếu bạn có quyền kiểm soát thiết kế phần cứng tổng thể và thêm một IC khác là một tùy chọn, tôi sẽ cân nhắc mạnh mẽ cách tiếp cận dựa trên phần cứng. Bạn chắc chắn có thể làm cho UART phần mềm hoạt động bằng cách sử dụng bit-banging , nhưng bạn có thể không muốn dành tài nguyên CPU để tạo thời gian cần thiết.

Nhìn lướt qua bảng dữ liệu, có vẻ như bộ vi điều khiển của bạn có cả SPI và I2C (mà Atmel gọi là Giao diện hai dây (TWI)). Đây có lẽ sẽ là các giao diện tốt nhất để sử dụng để đính kèm một UART bên ngoài. Các thiết bị cho biết có sẵn từ một số nhà sản xuất. Vài ví dụ:

  • Xuất ngoại ( http://www.exar.com/connectivity/uart-and-opedging-solutions/i2c-spi-uarts ) có sẵn một dòng thiết bị UART SPI / I2C 1- và 2 kênh, bao gồm ~ 1.6- Phạm vi hoạt động 3.3V. Tôi đã không sử dụng bất kỳ bộ phận nào trong số này một cách cụ thể, nhưng tôi đã sử dụng các thiết bị Exar trong quá khứ (với giao diện bus bộ nhớ song song) và chúng đã hoạt động tốt.

  • NXP ( http://ics.nxp.com/products/equges/i2c.spi.slave.uart.irda.gpio/ ) có sẵn một dòng thiết bị SPI / I2C UART / IrDA / GPIO, cũng trong 1- và 2 giống-kênh trên một vài phạm vi điện áp. Tôi đã sử dụng các bộ phận này (cụ thể là SC16IS762) trong quá khứ với thành công lớn.

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) có các thiết bị MAX3110E và MAX3111E, là các UART được kết nối SPI. Một tính năng độc đáo của các thiết bị này là chúng có trình điều khiển dòng RS-232 tích hợp. Vì vậy, nếu bạn cần UART của mình để giao tiếp với thiết bị sử dụng điện áp dòng RS-232 thay vì mức logic (ví dụ: PC), điều này có thể hữu ích, vì nó sẽ giúp bạn tiết kiệm từ việc thêm IC điều khiển dòng khác vào bo mạch của bạn.


Wow, không bao giờ biết Maxim có những món đồ đó, sẽ +2 nếu tôi có thể.
Tevo D


8

Bạn sẽ cần sử dụng trình điều khiển UART phần mềm. Tùy thuộc vào chính xác những gì bạn mong đợi từ UART này, bạn có thể sử dụng AVR305 (cực kỳ nhỏ gọn, nhưng không có tính năng nào ngoài việc chặn gửi / nhận song công), AVR274 (điều khiển ngắt, khá đầy đủ tính năng), bạn có thể viết trình điều khiển UART phần mềm của riêng bạn hoặc bạn có thể sử dụng một cái bạn tìm thấy trên internet, ví dụ bằng cách googling 'avr software uart'


3

Một lưu ý ngắn gọn về thiết kế phần mềm "UART": có ít nhất các cách tiếp cận khác nhau về mặt chất lượng mà người ta có thể thực hiện, tùy thuộc vào yêu cầu:

  • Trình điều khiển bit-bang "tiếp quản mọi thứ" sẽ vô hiệu hóa tất cả các ngắt và sử dụng mã được tính theo chu kỳ để theo dõi từng bit. Nhận dữ liệu với trình điều khiển "tiếp quản mọi thứ" yêu cầu rằng khi dữ liệu đến, bộ điều khiển không làm gì ngoài việc chờ đợi nó.

  • Trình điều khiển bit-bang "tiếp quản vòng lặp chính" sẽ hoạt động giống như trên, ngoại trừ việc nó sẽ sử dụng tài nguyên bộ định thời cho thời gian bit thay vì đếm chu kỳ. Ngắt mà không mất quá nhiều thời gian để phục vụ có thể được kích hoạt. Đối với truyền nối tiếp, tài nguyên bộ đếm thời gian cố định có thể được chia sẻ với các mục đích khác; tuy nhiên, đối với việc nhận nối tiếp, trình điều khiển bit-bang sẽ phải có thể tải lại bộ hẹn giờ khi bit start bắt đầu để làm cho nó hết hạn ở giữa mỗi thời gian bit đến.

  • Trình điều khiển bit-bang được điều khiển ngắt hoàn toàn sử dụng bộ hẹn giờ tốc độ cố định chạy ở nhiều mức tốc độ dữ liệu tốt nhất (3x và 5x đều tốt hơn 4x) và thực hiện mọi thứ thông qua bộ hẹn giờ đó. Trình điều khiển như vậy có thể chạy đồng thời với mọi thứ khác, nhưng sẽ yêu cầu CPU nhanh hơn các loại trình điều khiển trước đây sẽ yêu cầu.

Để tránh việc hai kiểu điều khiển đầu tiên phải đợi mãi cho dữ liệu có thể không bao giờ đến, thông thường các thói quen đọc sẽ bao gồm giá trị hết thời gian chờ. Lưu ý rằng nếu vòng lặp của bộ điều khiển aa thực hiện, ví dụ: "lấy một byte trong khi chờ tới 100ms cho nó, hãy thực hiện một số công việc khác nếu không có, sau đó lấy byte tiếp theo, v.v." và một byte đến giữa thời gian "get" hết thời gian và bộ điều khiển bắt đầu chờ lại, byte đó sẽ bị mất; thiết bị mà nó giao tiếp sẽ phải chờ đợi khả năng đó.

Chỉ có kiểu trình điều khiển thứ ba mới có thể xử lý khả năng byte dữ liệu bắt đầu đến trong khi byte dữ liệu đang được truyền đi. Tuy nhiên, hai kiểu đầu tiên có thể được sử dụng cho một số giao thức truyền thông song công toàn tốc độ đầy đủ nếu bộ điều khiển chỉ phải nói khi nói chuyện. Mẹo nhỏ là có một thói quen "đọc và ghi dữ liệu", nó sẽ đợi bit bắt đầu đến và khi phát hiện ra một chồng lên đọc và ghi sao cho bộ điều khiển gửi từng bit giống như khi nó kiểm tra dữ liệu đến. Khi bộ điều khiển phát hiện bit khởi động đến, nó sẽ biết chính xác khi nào nó sẽ tìm kiếm 8 bit dữ liệu và bit dừng tiếp theo, và do đó sẽ biết rằng nó có thể sử dụng thời gian giữa để xuất dữ liệu của mình một cách an toàn.

Một lưu ý chia tay: bộ điều khiển sử dụng một trong hai kiểu đầu tiên của bit-bang uart để nhận dữ liệu phải xử lý từng byte dữ liệu trước khi cạnh xuống của bit bắt đầu của byte kế tiếp để tránh mất dữ liệu. Nếu bộ điều khiển biết rằng việc xử lý sẽ mất ít nhất nửa thời gian, nó có thể tối đa hóa thời gian có sẵn để xử lý bằng cách chấp nhận từng byte ngay khi lấy được bit dữ liệu cuối cùng, thay vì chờ bit dừng. Tuy nhiên, như một phương tiện nữa giúp bộ điều khiển có nhiều thời gian hơn, tuy nhiên, có thể hữu ích khi thiết bị cung cấp cho nó dữ liệu truyền với hai bit stop chứ không phải một. Nếu "đánh dấu chẵn lẻ" có thể được cấu hình, điều đó sẽ thêm một chút thời gian nữa. Truyền tại ví dụ 115200-8-M-2 sẽ cho phép thời gian xử lý nhiều hơn 57600-8-N-1, mặc dù nó sẽ cung cấp dữ liệu nhanh hơn 1,6 lần.


1

Bạn chỉ có thể sử dụng chân I / O của uC. Chỉ có điều khi chuyển đổi hoặc chuyển dữ liệu trên các chân này, bạn nên có tần số của các chân tăng gấp đôi với tốc độ baud. Đây là cách UART thường hoạt động, nó sẽ lấy mẫu tín hiệu bit ở giữ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.