Làm thế nào để có được nhiều hơn một giao diện uart


30

Ok, tôi có một giao diện uart (TXD GPIO 14, RXD GPIO 15). Tôi muốn ít nhất một giao diện uart nữa.

Phương pháp khả thi:

  • Bit banging: Sử dụng hai GPIO dự phòng không liên quan. Tôi hiểu rằng thời gian là một vấn đề trên một linux tiêu chuẩn. Nó sẽ đáng tin cậy với baudrate rất thấp?

  • Chuyển đổi: RPI quyết định khi nói chuyện với thiết bị nào. Sử dụng ví dụ CD4066BC .

  • spi đến 2 x uart cầu: Không tìm thấy một phần phù hợp (sẵn có, giá cả, gói giãn nở)

  • usb to uart: Đắt tiền

Có những lựa chọn khác? Tôi có xu hướng chuyển đổi, nếu nó có thể được thực hiện. Bạn sẽ khuyên gì?


Câu trả lời:


10

Một USB UART, chẳng hạn như FTDI, không thực sự đắt tiền. Tất cả các tùy chọn khác của bạn có vẻ như chúng sẽ khiến bạn tốn nhiều chi phí và thời gian hơn ~ $ 13, nó có thể khiến bạn phải trả giá, và không đáng tin cậy hoặc chậm. Chỉ cần chọn tùy chọn nhanh và không gặp sự cố, chẳng hạn như:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

Sparkfun cũng bán một cái. Trên thực tế, có thể bạn chỉ cần rút một thiết bị USB cũ hoặc mua một thiết bị từ cửa hàng rác mà không biết nó làm gì.

Tôi đã nhầm lẫn với bộ chuyển đổi SPI sang UART cho một dự án Arduino, không có thư viện hiện có nên tôi đã tự viết. Cuối cùng thì nó vẫn hoạt động tốt, nhưng nếu tôi có thể bỏ một phần 15 đô la thì tôi sẽ có. Trong thực tế với thời gian nó làm tôi tốn kém, tôi nên có một mega với 4 cổng nối tiếp.

Ngoài ra, nếu bạn muốn có nhiều cổng nối tiếp, bạn có thể xem nối tiếp RS485, tương tự như 232 (mặc dù không tương thích), hỗ trợ đa thả, tức là một số giao diện trên một dòng.


1
Đây cũng là tùy chọn dễ dàng từ quan điểm phần mềm. FTDI có hỗ trợ trình điều khiển Linux. Tất cả các tùy chọn khác sẽ yêu cầu công việc lái xe siêng năng.
Ber

Cp2102 là chip uart usb yêu thích của tôi. Một tìm kiếm nhanh trên amazon cho thấy chúng có giá 6,99 đô la (thực sự chỉnh sửa 1,50 đô la) với cáp đi kèm! Không thể đánh bại điều đó!
portforwardpodcast

6

Nếu bạn quyết định bỏ qua việc thêm phần cứng bổ sung và chỉ đi theo lộ trình bit-bang, điều này không khó như một số hình ảnh.

Trước hết, chủ đề giao tiếp của bạn phải đi theo thời gian thực:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

Từ giờ trở đi, chuỗi của bạn sẽ không bị xóa trước 950ms trong mỗi giây * , trừ khi nó trả lại quyền kiểm soát một cách tự nguyện (thông qua sched_yield()hoặc usleep()) một cách kịp thời, điều đó sẽ không khiến nó bị xóa trước bao giờ. Với CPU 850 MHz, vòng lặp bit-bang của bạn sẽ chạy không tải hầu hết thời gian ngay cả ở tốc độ nhanh nhất.

Thật không may, yêu cầu trả lại quyền kiểm soát theo thời gian có nghĩa là trong khi chủ đề của bạn đang ngủ, bất cứ điều gì "bên đối lập" của bạn gửi, sẽ bị mất mãi mãi. Nhưng với mục đích đó, bạn có thể sử dụng điều khiển truyền dẫn. Hoặc phân bổ thêm một số GPIO cho dòng CTS mà bạn kéo xuống trước khi thu được và sao lưu khi khôi phục điều khiển:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

hoặc (tốt nhất là IMHO) sử dụng điều khiển truyền XON / XOFF - gửi ký tự XOFF qua RS232 trước khi ngủ, XON sau khi bạn tiếp tục hoạt động. Các mã ASCII mặc định cho các mã này là '\x13'dành cho XOFF / "dừng gửi" và '\x11'cho XON / "gửi lại".

Tất nhiên thiết bị từ xa của bạn phải tuân theo những điều này. Nếu không, một số dữ liệu sẽ bị mất.


4

Tôi đã tìm thấy những gì bạn đang tìm kiếm: một nô lệ I2C / SPI cho cầu UART / IrDA / GPIO.

Chúng có phiên bản đơn và kép (vì vậy 1 hoặc 2 UART phụ). Họ (NXP) cũng (đối với bên kia trong trường hợp cần thiết) có chủ I2C / SPI cho các cầu nối UART / IrDA / GPIO.

Thông tin chi tiết có thể được tìm thấy về những chip ở đây và các bậc thầy người đồng nhiệm.

Maxim cũng có chip làm điều tương tự chính xác.


Thông tin tốt, nhưng các liên kết NXP cung cấp HTTP 403 ở đây.
Tom

Đây là biểu dữ liệu có liên quan: nxp.com/document/data_sheet/SC16IS752_SC16IS762.pdf ?
Tom

3

Cầu nối USB đến UART là rẻ và có sẵn, nhưng có đặc điểm thời gian thực sự tệ hại. Newark bán bảng "Embedded Pi" có bộ xử lý ARM STM32F mà bạn có thể viết mã kim loại trần. Con chip đó có ba UART trên đó và tôi nghĩ chúng có thể đi khá nhanh; nếu bạn sử dụng một chiếc để liên lạc với Raspberry Pi, thứ sẽ có sẵn cho hai mục đích khác. Tuyên bố miễn trừ trách nhiệm: Tôi đã mua một trong những bảng này, nhưng đơn giản là đã sử dụng chính Raspberry Pi để xử lý trực tiếp các nhu cầu I / O.

Nếu bạn muốn có nhiều UART chậm hơn, STM32F trên bảng Pi nhúng có thể có thể xử lý một số lượng hợp lý, đặc biệt nếu bạn sẵn sàng viết một số ngôn ngữ lắp ráp Arm. Nếu có hai nhóm 16 chân I / O có sẵn trên một bảng duy nhất thì có thể có 16 UART phần mềm đồng thời hoạt động cùng một lúc với tốc độ truyền khá tốt (có ngắt định kỳ ở tốc độ 3x hoặc 5x tốc độ baud lưu trữ Các giá trị chốt 16 bit từ cổng nhận vào bộ đệm và xuất các giá trị được tính toán trước 16 bit từ bộ đệm sang cổng truyền; nếu bạn làm điều này, thì cung cấp thời gian phục vụ trung bình cho UART phần mềm không quá lớn, nó sẽ không có vấn đề gì nếu thỉnh thoảng xảy ra trường hợp xấu nhất (ví dụ: tất cả mười sáu cổng nhận được một byte).

Cách tiếp cận này thực sự có thể có hiệu quả rõ rệt khi nhận, vì mã "trường hợp chung" thậm chí không phải xem xét các UART riêng lẻ. Giả sử rằng bạn đang lấy mẫu dữ liệu ở mức 5x và 47 byte cuối cùng của bộ đệm được sao chép ngay trước nó. Giả sử dữ liệu được ghi vào bộ đệm theo thứ tự tăng dần, sau đó bạn có thể kiểm tra xem có bất kỳ byte nào đã được nhận đầy đủ trên bất kỳ 16 kênh nào hay không bằng cách nói đơn giản:

bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);

Nếu bytes_readybằng 0, không có dữ liệu nào được nhận. Mặt khác, nếu ví dụ bit 2 của bytes_readyđược đặt, điều đó có nghĩa là có thể tìm thấy một byte dữ liệu nhận được trong bit 2 của dữ liệu [rx_ptr-40], dữ liệu [rx_ptr-35], dữ liệu [rx_ptr-30], v.v. dữ liệu, xóa bit 2 của armed_flag và sắp xếp để nó được thiết lập lại sau khoảng 44 mẫu.

Cách tiếp cận này sẽ yêu cầu một chút công việc đối với các mẫu đó trong đó một byte dữ liệu được nhận đầy đủ (và có khả năng rất nhiều công việc nếu tất cả 16 kênh có một byte dữ liệu đến cùng một lúc) nhưng trên hầu hết các mẫu sẽ có lượng công việc rất lớn nhẹ Nếu một người có 64 chân I / O, một người có thể xử lý tối đa 32 UART bằng cách sử dụng phương pháp này mà không cần thêm bất kỳ công việc bổ sung nào vào trường hợp "chung".


1

Một bộ vi điều khiển như Picaxe có thể lấy dữ liệu nối tiếp trên một pin và xuất dữ liệu nối tiếp trên một pin nhất định một cách thích hợp. Điều này thực sự sẽ cung cấp cho bạn nhiều đầu ra nối tiếp hơn nếu bạn chuẩn bị phải báo cho Picaxe biết pin nào sẽ xuất ra. Nó cũng có thể làm tương tự, nhưng ngược lại, vì vậy nó có thể nhận dữ liệu nối tiếp từ nhiều thiết bị và gửi nó đến Raspberry Pi. Một lựa chọn khác có thể là làm cho các thiết bị được kết nối yêu cầu vòng loại . Điều này có nghĩa là Thiết bị 1 sẽ phải nhận dữ liệu 'd1', ví dụ trước khi thiết bị nghe dữ liệu tiếp theo trên dòng nối tiếp. Thiết bị 2 có thể có 'd2' là vòng loại của nó. Điều này có nghĩa là để nói 'xin chào' với Thiết bị 1, bạn chỉ cần gửi 'd1hello' trên dòng UART.

Picaxes khá rẻ, bạn có thể lấy chúng tại http://www.techsupplies.co.uk/ và chúng có nhiều kích cỡ với số lượng chân khác nhau, v.v.


1

Nếu việc liên lạc với một số thiết bị nô lệ UART không cần xảy ra song song, bạn có thể chia sẻ một cổng UART có sẵn giữa chúng. Bạn có thể sử dụng bóng bán dẫn để chỉ kích hoạt các kết nối RxD / TxD cho thiết bị mà bạn hiện muốn nói chuyện. Các bóng bán dẫn này có thể được điều khiển bởi các chân GPIO Raspberry Pi khác.


1

Raspberry Pi 4 hiện hỗ trợ tối đa 4 giao diện UART cần được kích hoạt bằng lớp phủ cây thiết bị. Bạn có thể tìm thấy cách thực hiện việc này và Ghim nào được sử dụng tại đây ngay bây giờ:

https://www.raspberrypi.org/forums/viewtopic.php?t=244827

Nền tảng RPi vẫn đang chuẩn bị tài liệu cho việc này.



0

Tôi đang sử dụng IC SC16IS752 là bộ chuyển đổi SPI sang 2xUART. Nó hoạt động tốt với Raspbian Stretch.

Nó đắt hơn một chút so với chip FTDI, nhưng có hai uarts và tôi không phải sử dụng cổng USB quý giá.


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.