둘 이상의 uart 인터페이스를 얻는 방법


30

좋아, 하나의 uart 인터페이스 (TXD GPIO 14, RXD GPIO 15)가 있습니다. 적어도 하나 이상의 uart 인터페이스를 원합니다.

가능한 해결책:

  • 비트 뱅킹 : 관련이없는 여분의 GPIO 2 개를 사용하십시오. 표준 리눅스에서는 타이밍이 문제라는 것을 알고 있습니다. 매우 낮은 전송 속도로 신뢰할 수 있습니까?

  • 스위칭 : RPI는 언제 어떤 장치와 통신 할 것인지 결정합니다. 예를 들어 CD4066BC 사용 .

  • spi to 2 x uart bridge : 적합한 부품을 찾지 못했습니다 (가용성, 가격, 딜 패키지)

  • uart에 usb : 비싼

다른 옵션이 있습니까? 할 수 있다면 전환하는 경향이 있습니다. 무엇을 조언 하시겠습니까?


답변:


10

FTDI와 같은 USB UART는 실제로 비싸지 않습니다. 다른 모든 옵션은 비용이 ~ $ 13보다 비싸고 시간이 많이 걸리고 신뢰할 수 없거나 느리게 들리는 것처럼 들립니다. 다음과 같이 빠르고 문제가없는 옵션을 찾으십시오.

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

Sparkfun도 판매합니다. 사실, 오래된 USB 장치에서 장치를 꺼내거나 그 기능을 모르는 정크 저장소에서 장치를 구입할 수 있습니다.

Arduino 프로젝트 용 SPI 대 UART 어댑터를 엉망으로 만들었습니다. 기존 라이브러리가 없었기 때문에 직접 작성했습니다. 결국 그것은 효과가 있었지만 방금 $ 15 부분을 떨어 뜨릴 수 있다면 좋을 것입니다. 실제로 시간이 걸리기 때문에 4 개의 직렬 포트가있는 메가를 구입해야합니다.

또는 많은 직렬 포트를 원할 경우 RS485 직렬을 볼 수 있습니다. RS485 직렬은 232와 유사하지만 (다만 호환되지는 않지만) 멀티 드롭을 지원합니다.


1
소프트웨어 관점에서도 쉽게 선택할 수 있습니다. FTDI는 기본적으로 Linux 드라이버를 지원합니다. 다른 모든 옵션은 힘든 드라이버 작업이 필요합니다.
Ber

cp2102는 제가 가장 좋아하는 USB UART 칩입니다. 빠른 아마존 검색으로 케이블이 포함 된 $ 6.99 (실제로 $ 1.50 편집)로 표시됩니다! 그것을 이길 수 없다!
portforwardpodcast

6

추가 하드웨어 추가를 건너 뛰고 비트 뱅킹 경로를 사용하기로 결정했다면 그림만큼 어렵지 않습니다.

먼저, 통신 스레드는 실시간으로 진행되어야합니다.

#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;
}

지금부터, 스레드는 각 초에서 950ms에 대한 선점되지 않습니다 * 은 (을 기꺼이 제어를 반환하지 않는 한, sched_yield()또는 usleep()이제까지 선점하지 것이다, 적시에). 850MHz CPU를 사용하면 비트 뱅킹 루프가 가장 빠른 속도에서도 대부분 유휴 상태로 실행됩니다.

불행히도 때때로 제어권을 때때로 돌려 주어야한다는 요구 사항은 스레드가 잠든 동안 "상대방"이 보내는 모든 것이 영원히 사라질 것임을 의미합니다. 그러나 그러한 목적으로 변속기 제어를 사용할 수 있습니다. CTS 라인에 GPIO를 더 할당하십시오. 제어를 복원 할 때 양보하고 백업하기 전에 풀다운하십시오.

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

또는 (IMHO가 바람직하게) XON / XOFF 전송 제어를 사용하십시오-취침 전에 X232 문자를 RS232를 통해 보내십시오. 이들의 기본 ASCII 코드는 '\x13'XOFF / "전송 중지"및 '\x11'XON / "전송 다시 시작"입니다.

물론 원격 장치는 이것들을 준수해야합니다. 그렇지 않으면 일부 데이터가 손실됩니다.


4

UART / IrDA / GPIO 브리지에 대한 I2C / SPI 슬레이브를 찾고 있습니다.

단일 및 이중 버전으로 제공되므로 1 개 또는 2 개의 추가 UART가 있습니다. 또한 (필요한 경우 다른 쪽의 경우) UART / IrDA / GPIO 브리지에 대한 I2C / SPI 마스터도 있습니다.

이 칩 과 마스터에 대한 자세한 정보는 여기를 참조하십시오. 대응.

Maxim은 또한 똑같은 일을하는 을 가지고 있습니다.


좋은 정보이지만 NXP 링크는 여기에 HTTP 403을 제공합니다.
Tom

관련 데이터 시트는 다음과 같습니다. nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
Tom

3

USB-UART 브리지는 저렴하고 쉽게 구할 수 있지만 타이밍 특성이 매우 큽니다. Newark는 베어 메탈 코드를 작성할 수있는 STM32F ARM 프로세서가있는 "Embedded Pi"보드를 판매합니다. 그 칩에는 3 개의 UART가 있으며 꽤 빨리 갈 수 있다고 생각합니다. 하나를 사용하여 Raspberry Pi와 통신하는 경우 다른 용도로 두 가지를 사용할 수 있습니다. 면책 조항 : 나는이 보드 중 하나를 구입했지만 I / O 요구를 직접 처리하기 위해 Raspberry Pi 자체를 사용했습니다.

더 느린 UART를 많이 원한다면 특히 Pi 어셈블리 언어를 작성하려는 경우 Embedded Pi 보드의 STM32F가 공정한 수를 처리 할 수 ​​있습니다. 단일 보드에 2 개의 16 개의 I / O 핀 그룹이있는 경우 16 개의 동시 소프트웨어 UART가 모두 꽤 양호한 보드 속도로 동시에 작동 할 수 있습니다 (보존 속도가 3 배 또는 5 배인주기적인 인터럽트가 있음) 수신 포트에서 버퍼로 16 비트 래치 된 값 및 버퍼에서 전송 포트로 16 비트 사전 계산 된 값을 출력합니다. 그렇게하면 소프트웨어 UART의 평균 서비스 시간이 너무 길지 않은 경우 경우에 따라 최악의 경우가 발생하더라도 (예 : 16 개의 모든 포트가 동시에 바이트를 수신하는 경우) 중요하지 않습니다.

"일반적인 경우"코드는 개별 UART를 볼 필요가 없기 때문에이 방법은 실제로 수신하기에 매우 효율적으로 작동 할 수 있습니다. 데이터를 5 배로 샘플링하고 버퍼의 마지막 47 바이트가 바로 앞에 복제된다고 가정합니다. 데이터가 오름차순으로 버퍼에 기록되었다고 가정하면 다음과 같이 간단히 말하면 16 개 채널 중 하나에서 바이트가 완전히 수신되었는지 확인할 수 있습니다.

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

경우 bytes_ready제로, 데이터가 수신되지 않았습니다. 그렇지 않으면, 예를 들어 비트 2 bytes_ready가 설정되면, 수신 된 데이터 바이트가 데이터 [rx_ptr-40], 데이터 [rx_ptr-35], 데이터 [rx_ptr-30] 등의 비트 2에서 발견 될 수 있음을 의미한다. 데이터는 armed_flag의 비트 2를 지우고 약 44 개의 샘플 후에 재설정되도록 정렬합니다.

이 방법은 1 바이트의 데이터가 완전히 수신되는 샘플에 대해 약간의 작업이 필요하며 (16 개의 채널 모두에 1 바이트의 데이터가 한 번에 도착하면 잠재적으로 많은 작업이 필요) 대부분의 샘플에서 작업량은 매우 많을 것입니다 근소한. 하나의 I / O 핀이 64 개인 경우 "공통"사례에 추가 작업을 추가하지 않고도이 방법을 사용하여 최대 32 개의 UART를 처리 할 수 ​​있습니다.


1

Picaxe와 같은 마이크로 컨트롤러는 한 핀에서 직렬 데이터를 가져 와서 특정 핀에서 직렬 데이터를 적절하게 출력 할 수 있습니다. Picaxe에 출력 할 핀을 알려 주어야 할 경우 직렬 출력을 효과적으로 얻을 수 있습니다. 또한 동일한 작업을 수행 할 수 있지만 반대의 경우에도 여러 장치에서 직렬 데이터를 수신하여 Raspberry Pi로 전송할 수 있습니다. 다른 옵션은 연결된 장치에 한정자가 필요하도록하는 것 입니다. 이것은 장치 1이 예를 들어 직렬 라인에서 추가 데이터를 청취하기 전에 데이터 'd1'을 수신해야한다는 것을 의미합니다. 장치 2는 한정자로 'd2'를 가질 수 있습니다. 이것은 장치 1에 'hello'라고 말하면 UART 라인에 'd1hello'를 보내면됩니다.

Picaxes는 상당히 저렴합니다. http://www.techsupplies.co.uk/ 에서 구할 수 있으며 핀 수가 다른 다양한 크기로 제공됩니다.


1

여러 UART 슬레이브 장치와의 통신을 병렬로 수행 할 필요가 없으면 사용 가능한 UART 포트 하나를 공유 할 수 있습니다. 트랜지스터를 사용하여 현재 대화하려는 장치에 대한 RxD / TxD 연결 만 활성화 할 수 있습니다. 이 트랜지스터는 다른 Raspberry Pi GPIO 핀으로 제어 할 수 있습니다.


1

Raspberry Pi 4는 이제 장치 트리 오버레이를 통해 활성화해야하는 최대 4 개의 UART 인터페이스를 지원합니다. 이 작업을 수행하는 방법과 현재 사용중인 핀을 찾을 수 있습니다.

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

RPi 재단은 여전히이를위한 문서를 준비하고 있습니다.



0

SPI to 2xUART 변환기 인 SC16IS752 IC를 사용하고 있습니다. Raspbian Stretch와 잘 작동합니다.

FTDI 칩보다 약간 비싸지 만 두 개의 Uart가 있으며 귀중한 USB 포트를 사용할 필요가 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.