비표준 직렬 신호를 효율적으로 디코딩하는 방법


11

저는 RF 전송 ASIC이 포함 된 프로젝트를 수행하는 연구팀의 학부 회원이며 궁극적으로 데이터를 PC로 보내야하는 무선 수신기입니다.

수신기는 빠르고 연속적인 비동기 비표준 직렬 신호 (SPI, I2C, UART 등이 아님)를 출력하므로 수신기는 컴퓨터에 인터페이스하기 위해 마이크로 컨트롤러 소프트웨어를 작성해야합니다. 현재 내 접근 방식은 에지 트리거 인터럽트를 사용하여 데이터를 순환 버퍼에 배치하고 메인 루프에서 전체 비트 단위 디코딩 프로세스를 수행하는 것입니다. 마이크로 컨트롤러는 USB (가상 COM 포트)를 사용하여이 데이터를 컴퓨터에 동시에 출력해야합니다.

여기에 내가 가진 문제와 내가 기대하는 문제가 있습니다.

  1. 강력한 72MHz ARM Cortex M3 프로세서를 사용해도 버퍼링 된 데이터를 충분히 빠르게 처리 할 수 ​​없습니다. 비트 전송률은 400Kbps (2.5us / bit)입니다. 참고로 비트 당 180 사이클 만 남습니다 (디코딩 및 ISR은 ~ 30 사이클의 오버 헤드 아야를 포함합니다)! MCU는 또한 메인 루프에서 폴링하는 다른 많은 작업을 처리해야합니다.

  2. USB 가상 COM 포트 드라이버도 인터럽트 기반입니다. 이것은 비트가 전송 될 수있는 2.5 마이크로 초 (180 사이클) 창을 놓치도록 드라이버가 결국 프로세서를 오랫동안 중단 할 것이라고 확신합니다. 이와 같은 인터럽트 충돌 / 레이스가 일반적으로 어떻게 해결되는지 잘 모르겠습니다.

문제는 간단히 말해서, 이러한 문제를 해결하기 위해 무엇을 할 수 있습니까, 아니면 이것이 올바른 접근법이 아닙니까? 소프트웨어 중심적인 접근 방식도 고려하지 않겠습니다. 예를 들어, 디코딩을 위해 일종의 하드웨어 상태 머신과 함께 전용 USB 칩을 사용하지만 이는 익숙하지 않은 영역입니다.


나는, 내가 좋아하는 많은 제안들이 빨리 대답하고, 당신의 질문에 잘 말하는 것을 보는 것은 드문 일입니다. 데이터 버트에 대해 더 알고 싶습니다. 그것들이 갑자기 터져서 갑자기 최고 속도를 낸 후 데이터가 적은 기간입니까, 아니면 연속적인 데이터가있는 기간을 연장 할 가능성이 있습니까?
Kortuk

ASIC에 전원이 공급되는 한 지속적인 데이터 스트림을 전송합니다. 전혀 파열되지 않습니다. 컴퓨터 판독 값이있는 실시간 의료 감지 응용 프로그램입니다. 심전도를 본 적이 있습니까?
Keegan Jay

여기에 많은 훌륭한 답변이 있습니다. 인터럽트 변경이 포함 된 솔루션과 전용 하드웨어 / 디지털 로직이 포함 된 솔루션간에 명확한 구분이있었습니다. 내가 익숙하지만 아직 경험하지 않은 FPGA 및 Verilog와 같은 것들은 장기적으로 저장해야 함을 의미합니다. 단기 @rocketmagnets에서는 덜 인터럽트가 많은 방법이 좋습니다. 나는 디지털 작업에 정신적 인 작업을하고 진정한 계산을 위해 ARM을 저장하는 우아함을 좋아합니다. 앞으로 ARM의 성능은 무선 직렬 데이터의 분석 및 필터링에 사용될 것입니다.
Keegan Jay

신호가 동기식입니까, 비동기식입니까?
markrages

비동기식. 4 개의 시작 비트, 10 개의 데이터 비트, 2 개의 정지 비트. 전송하는 ASIC의 특성으로 인해 HI 및 LO 시간은 칩마다 크게 다릅니다. 보오율을 추론하는 알고리즘을 이미 작성했습니다.
Keegan Jay

답변:


5

또 다른 대답 : 인터럽트 사용을 중지하십시오.

사람들은 인터럽트를 너무 쉽게 사용하려고 뛰어 들었습니다. 개인적으로, 나는 당신이 발견하는 것처럼 실제로 많은 시간을 낭비하기 때문에 거의 사용하지 않습니다.

대기 시간이 사양 내에 있고 시간이 거의 걸리지 않기 때문에 모든 것을 너무 빨리 폴링하는 메인 루프를 작성할 수 있습니다.

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

루프에 다른 것들보다 훨씬 더 자주 발생하는 것들이있을 수 있습니다. 예를 들어 들어오는 비트는 아마도 더 많은 테스트를 추가하여 더 많은 프로세서가 해당 작업에 전념 할 수 있습니다.

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

이 방법의 대기 시간이 너무 높은 이벤트가있을 수 있습니다. 예를 들어, 매우 정확하게 시간이 지정된 이벤트가 필요할 수 있습니다. 어떤 경우에는 인터럽트시 해당 이벤트가 발생하고 루프에 다른 모든 항목이 있습니다.


나는 다른 Rocketmagnet 사람의 대답보다 당신의 대답이 더 좋습니다. Rocketmagnet은 더 많은 하드웨어, 더 빠른 하드웨어, 더 많은 다른 것 대신 더 적은, 더 나은, 간단한 것을 제안합니다.

좋아, 많은 경우 인터럽트가 솔루션을 훨씬 더 좋게 만드는 것을 보았습니다. 그들은 훌륭한 일을하고, 체계적인 코드, 짧은 대기 시간 및 기타 많은 이점을 허용하지만 여기에 동의해야합니다. 프로세스가 너무 강해 보이는 것처럼 보입니다. 1 컨트롤러는 직렬 스트림 처리에 모든주의를 기울여야 할 수도 있습니다. 디지털 프론트 엔드는 나에게 이상적이지만 학교 프로젝트 일 때 마이크로와 FPGA가없는 경우가 많습니다. 마이크로를 먼저 처리하고 나중에 FPGA에 맞게 교체하려고합니다. 비용.
Kortuk

이것은 아마도 단기적으로 함께 할 솔루션 일 것입니다. 나는 기존의 직렬 드라이버를 상당 부분 다시 작성하기 때문에이를 피하기를 희망했지만 짧은 시간 동안 내 능력 안에있는 우아한 솔루션입니다.
Keegan Jay

1
@JayKeegan-예, 아마도 솔루션으로가는 가장 빠른 경로 일 것입니다. PSoC와 FPGA는 다음 프로젝트를위한 접근법 일 수 있습니다.
Rocketmagnet 2016 년

6

마이크로 컨트롤러 대신 FPGA를 사용하여 무선 데이터 스트림을 디코딩하고 버퍼링 할 수 있습니다. 그런 다음 ARM 프로세서를 사용하여 FPGA 버퍼를 플러시하고 (예 : SPI 인터페이스 사용) 내용을 USB 통신 포트로 전달하십시오. 작동하지만 FPGA는 하드웨어 버퍼가 오버런되지 않도록 보장하기에 충분한 서비스를 제공하는 한 쉽게 유지할 수 있어야합니다 (또는 더 높은 수준의 프로토콜에서 삭제 된 데이터를 처리 할 수있는 경우) ).


이것은 장기적으로 훌륭한 솔루션이 될 수 있습니다. 나는 소프트웨어 솔루션 외에도 많은 디지털 로직 / 하드웨어 솔루션을 받기를 바랐습니다. 이제 이것들에 대해 배울 변명이 있기 때문입니다! 불행히도 FPGA에 대한 경험이 없습니다.
Keegan Jay

6

간편함 : PSoC5 마이크로 컨트롤러를 사용하십시오 .

PSoC

마이크로 컨트롤러의 사용 편의성과 CPLD가 포함되어 있으므로 Verilog에서 고유 한 하드웨어 주변 장치를 작성할 수 있습니다. 시리얼 데이터 디코더를 Verilog로 작성하고 DMA를 사용하여 USB 포트로 스트리밍하십시오.

한편 강력한 32 비트 ARM 코어는 Thumb 인스트럭션을 조정할 수 있습니다.


개요 페이지에 클럭 주파수가 표시되지 않아 의심이 듭니다. 데이터 시트는 40MHz라고 말합니다 (6MHz에서 6mA도 기록했습니다). 지금은 OP의 절반입니다. "MCU는 다른 많은 작업을 처리해야하기 때문에"이것이 좋은 아이디어인지 아닌지에 따라 달라질 수 있습니다.
stevenvh 2016 년

그들은 67MHz까지 올라간다. 따라서 대부분의 작업이 하드웨어에서 이루어지고 CPU에 더 많은 여유 시간이 남는 것을 제외하고는 OP의 현재 프로세서만큼 빠릅니다.
Rocketmagnet 2016 년

1
모든 데이터 시트를 보지 않았습니다 . 내가 선택한 첫 번째는 40MHz였습니다.
stevenvh 2016 년

@stevenvh-속도 등급이 다릅니다. PN의 세 번째 숫자는 속도 등급입니다. (4 = 48MHz, 6 = 67MHz).
Rocketmagnet 2016 년

1
이것은 또한 FPGA 아이디어와 마찬가지로 장기적으로 환상적인 솔루션입니다. 나는 이런 종류의 칩에 대해 들어 본 적이 없지만 나머지 보드의 많은 기능을 하나의 칩으로 가져옵니다. 앞으로 이것은 전체 리시버가 썸 드라이브 크기에 맞을 수 있음을 의미 할 수 있습니다. 이것이 제 프로젝트 리더의 비전입니다. 다음 학기에는 Verilog를 배우겠습니다.
Keegan Jay

4

빠르고 저렴한 작업을 선택할 수있는 고전적인 엔지니어링 선택이 있다고 생각합니다. 둘을 선택하십시오.

@vicatcu의 솔루션은 확실히 좋은 솔루션이지만 더 많은 하드웨어를 추가 할 수 없거나 추가 할 수없는 경우 (더 빠른 프로세서 포함) 선택해야합니다. 이 직렬 링크가 가장 중요한 경우 모든 비트가 수집 될 때까지 ISR에 앉아 있어야합니다. 비트 당 180 개의 명령어는 실제로 나쁘지는 않지만 모든 것을 시도하지는 않습니다. 전송 시작을 감지하면 전송이 완료 될 때까지 회전하십시오. 결과를 FIFO에 넣은 다음 정상적인 처리를 다시 시작하십시오.

각 전송이 얼마나 오래 지속되는지는 말하지 않지만 짧고 버스트 인 경우 실행 가능한 솔루션입니다. 가상 COM 포트 구현에 일부 하드웨어 버퍼링도 포함되어 있기 때문에 "lagg"인터럽트 서비스가 너무 많은 문제를 일으키지 않아야합니다. MCU가해야 할 나머지 부분까지는 몇 가지 디자인 결정을 내려야합니다.


이 솔루션은 인터럽트 기반 드라이버의 수를 줄여 로켓맨의 소프트웨어 접근 방식을 보완합니다. 내가 언급 한 기본 직렬 드라이버를 인터럽트 기반으로 유지할 수 있습니다. 또한 언급 한대로 전체 프레임을 읽을 때까지 회전을 시도합니다.
Keegan Jay

3

우선, 나는 이미 여기에있는 답변 중 일부를 좋아하고 일부는 내 투표를 얻었습니다.

그러나 또 다른 가능한 해결책을 제시하기 위해 : 프로젝트의 제약 조건에서 두 번째 마이크로 컨트롤러를 추가하는 것이 좋지 않을까요 (다른 보드 실행과 관련이 있습니까)? SPI와 같은 빠른 주변 장치를 통해 Cortex-M3에 연결하는 간단한 8 비트 마이크로 컨트롤러 일 수 있습니다. 선택한 8 비트 컨트롤러는 선택된 응답에서와 같이 비트를 폴링하고 바이트를 형성하지만 바이트가 있으면 전송하기 위해 SPI 데이터 레지스터로 덤프 할 수 있습니다.

cortex-M3 측은 수신 된 SPI 데이터를 단순히 중단합니다. 이전 400KHz 외부 에지 트리거 인터럽트를 50KHz로 줄입니다.

내가 제안하는 두 가지 이유는 다른 방법 (PSoC 또는 추가 FPGA) 중 일부가 약간 비싸기 때문에 (소규모 학업 프로젝트에는 중요하지 않지만) 일부를 보존 할 수 있기 때문입니다. 현재 코드의 구조

그 외에도 PSoC 아이디어는 DMA를 통해 USB로 전송하는 사용자 정의 주변 장치로 훌륭하다고 생각합니다.


이것은 실제로 이것을 게시 할 때 염두에 두었던 계획입니다. 인터럽트 (선택된 답변)에 대한 의존성을 줄여서 소프트웨어를 간소화 할 수 없다면 이것이 내가 할 것입니다. 그러나 그렇습니다. 디자인을 처음으로 얻는 데 어려움을 겪기 때문에 다른 보드 실행이 필요할 것입니다.
Keegan Jay

@JayKeegan, 하하 클럽에 오신 것을 환영합니다!
Jon L

2

데이터 형식이 UART의 형식과 비슷하지만 예측할 수없는 일관된 전송 속도로 들어오는 데이터의 모든 단어를 SPI 또는 표준 비동기 형식으로 변환하기 위해 CPLD를 사용하는 경향이 있습니다. CPLD 영역으로 나아가 야 할 필요는 없다고 생각합니다. 실제로, 개별 논리조차도 거의 작동 가능할 수 있습니다. 원하는 데이터 속도의 5 배 이상인 클럭을 생성 할 수 있으면 몇 개의 게이트로 5로 나누기 및 16으로 나누기 카운터를 사용할 수 있습니다. 입력이 유휴 상태이고 16으로 나누기 카운터가 0 일 때마다 다시 설정되도록 5 나누기 카운터를 정렬합니다. 그렇지 않으면 SPI 클럭 펄스를 생성하고 5로 나누기 카운터가 2를 칠 때마다 16으로 나누기 카운터를 충돌시킵니다.

5 배의 클록이 주어지면 16V8 (현재 가장 작고 가장 저렴한 프로그래머블 로직 장치)을 사용하여 SPI 클록을 생성 할 수 있습니다. 두 번째 16V8 또는 22V10을 5 배 클록을 생성하기 위해 분수 속도 분배기로 사용할 수도 있고, 약간 큰 칩 (CPLD)을 사용하여 모든 것을 하나로 수행 할 수도 있습니다.

편집 / 부록

추가 고려 사항이있을 때 CPLD를 사용하려는 경우 회로에 몇 가지 추가 개선 사항을 쉽게 추가 할 수 있습니다. 예를 들어, 적어도 1.5 비트 시간의 정지 비트를 수신 한 후 3.5 비트 시간의 시작 비트를 수신 할 때까지 회로를 정지시키기 위해 로직을 상당히 쉽게 추가 할 수있다. 너무 짧은 시작 비트를 수신하면 다시 정지 비트를 찾아야합니다. 또한 SPI를 사용하는 경우 / CS 신호를 사용하여 수신 장치가 올바르게 프레임 된 데이터를 볼 수 있습니다. SPI 데이터를 수신하는 장치가 10 비트 프레임을 처리 할 수 ​​있으면 해당 프레임을 직접 전송할 수 있습니다. 그렇지 않으면, 각각의 10 비트 프레임은 LSB 세트 (7 비트의 데이터)를 갖는 8 비트 프레임 및 모든 LSB의 클리어 (3 비트의 데이터)를 갖는 프레임으로서 전송 될 수있다; SPI 클럭은 정지 비트 동안 가속되므로 모든 데이터가 전송됩니다.

일부 마이크로 컨트롤러는 외부 신호에 의해 리셋 상태로 유지되는 능력과 같은 신호를 방출하는 타이밍을 동기화하는 기능을 포함하는 다소 다양한 PWM 생성 모듈을 가지고 있습니다. 마이크로 컨트롤러가 정확한 기능에 따라 CPLD 또는 타이밍 생성 회로를 상당히 단순화 할 수 있다면 그렇게 할 수 있습니다.

Rocketmagnet이 다소 만진 또 다른 방법은 직렬 데이터를 디코딩하고 기본 마이크로에서 사용할 수있는 형식으로 변환하는 것이 목적인 작은 마이크로를 갖는 것입니다. 400KHz의 데이터 전송 속도는 소프트웨어 디코딩 속도가 매우 빠르지 만 동시에 다른 작업을 수행하지 않아도 PIC와 같이 처리 할 수 ​​있습니다. 익숙한 장치에 따라 CPLD를 사용하는 것보다 쉬울 수 있습니다.


이것은 디코딩을위한 디지털 로직을 설계 할 때 매우 중요합니다. 실제로 SPI로 출력됩니다. 지금은 독립형 MCU를 사용하여 디코딩을 수행하고 있습니다 (시간 제한). 감사합니다!
Keegan Jay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.