마이크로 컨트롤러 프로그래밍 : JTAG, SPI, USB oh my !? 또는 SPI 인터페이스

마이크로 컨트롤러와 관련하여 몇 가지 프로그래밍 방법이 있음을 알았습니다. Arduino가 USB를 통해 프로그래밍 될 수 있기 때문에 USB에 익숙합니다.

JTAG 또는 SPI 인터페이스 란 무엇입니까?

궁극적으로 이러한 인터페이스는 칩을 새로운 명령으로 플래시하는 수단을 제공하지만 어떻게 다른가? 다른 것보다 장점이 있습니까?



답변

출고시 직접 출시되는 arduino와 같은 ATMEGA 마이크로 컨트롤러는 SPI 또는 JTAG 인터페이스를 통해서만 프로그래밍 할 수 있습니다.

SPI 는 Serial Peripheral Interface의 약어로 마이크로 컨트롤러가 서로 또는 외부 세계와 통신 할 수있는 방법입니다. 또한 3 선을 사용하여 통신하기 때문에 3 선이라고도합니다. 칩을 프로그래밍하려면 칩을 프로그래밍하기 위해 SPI 라인을 구동하기 위해 USB에서 명령을 읽는 특수 프로그래머가 필요합니다. 인기있는 것은 AdafruitUSBTinyISP 인 것 같습니다 . SPI 프로그래밍에 대한 아주 좋은 소개는 SparkFun입니다. Atmel AVR 칩 프로그래밍에 가장 많이 사용되는 응용 프로그램은 avrdude (cmd line), ponyprog (최신 프로그래머와 작동하지 않음) 및 AVR Studio (프로그래머가 지원하는 경우)입니다. SPI 프로그래밍의 장점은 공장에서 직접 Atmel 칩을 프로그래밍 할 수있어 프로젝트에 항상 Arduino가 필요하지 않다는 것입니다.

SPI가 “또 다른”직렬 프로토콜 인 경우 JTAG 는 특히 마이크로 컨트롤러를 프로그래밍하고 디버깅하도록 설계된 프로토콜입니다. 모든 Atmel micro가 JTAG를 지원하는 것은 아니지만 Arduino에서 사용되는 JTAG를 지원합니다. JTAG 프로토콜은 “회로 에뮬레이션”및 디버깅과 같은 멋진 작업에 사용할 수 있습니다. 즉, 실제로 실행되는 동안 마이크로 컨트롤러에서 프로그램의 상태를 볼 수 있습니다. 이를 위해서는 특별한 프로그래머가 필요합니다. 다른 질문에 대한 내 대답을 보았습니다 .

USB를 사용하여 칩을 프로그래밍하려면 먼저 SPI 또는 JTAG를 사용하는 “부트 로더”로 칩을 프로그래밍해야합니다. 부트 로더와 함께로드되면 USB 직렬 변환기를 사용하여 모든 PC에서 시스템을 프로그래밍 할 수 있습니다. 단점은 부트 로더가 약간의 메모리 공간을 차지하고이 방법을 사용하면 칩이 실행되는 동안 칩의 상태를 볼 수 없습니다.


답변

사용 가능한 다양한 프로그래밍 방법을 배우고 싶지만 다른 사람이 이미 가지고 있습니다. AVRFreaks, AVR 프로그래밍 방법 에 대한 Dean Camera 의 자습서 는 다음과 같습니다 .

AVR 마이크로 컨트롤러를 프로그래밍하는 방법에는 여러 가지가 있습니다. 많은 사람들이 한 번에 서로 다른 질문을하므로 질문에 신속하고 효율적으로 답변 할 수 있도록 여기에 설명 할 것이라고 생각했습니다. 방법을 놓치거나 오류가 있으면 용서해주십시오.

방법 1 : 시스템 프로그래밍 (ISP)

지원 : AVR 대다수 (아래 게시물 참조)
지원 프로그래머 : AVRISP MKI / II, JTAG MKII, STK500, STK600, Dragon, AVRISP 클론, AVR910 프로그래머, AVRONE

시스템 프로그래밍에서는 아마도 전체 AVR 라인의 플래시, EEPROM, 퓨즈 및 잠금 바이트를 프로그래밍하는 가장 일반적인 방법 일 것입니다. ISP는 매우 높은 클럭 속도로 AVR을 프로그래밍 할 수 있으며 (대상 AVR이 높은 주파수에서 실행되고 프로그래머가이를 지원한다고 가정) 거의 모든 AVR 애호가가 선택하는 방법입니다. 컴퓨터의 병렬 포트에 연결하는 간단한 DIY 동글 외에도 많은 AVRISP 클론 및 AVR910 프로그래머가 있습니다.

최근의 새로운 동글 설계에서는 컴퓨터의 직렬 포트를 사용할 수 있지만, 기술적 인 한계 때문에이 방법이 매우 느리다 는 일화 증거가 있습니다.

ISP는 대상 AVR이 ISP 시계의 4 배 이상의 클럭 속도로 실행 중이어야합니다. 이것은 일반적인 함정이며 많은 새로운 AVR에게 혼란의 근원입니다.

방법 2 : JTAG

지원 : MKI 및 MKII 장치 지원에 대해서는 AVRStudio Tools 도움말 참조 지원
되는 프로그래머 : JTAG-ICE, JTAG-ICE MKII, Dragon, JTAG-ICE 클론, AVRONE, STK600 (프로그래밍 만 해당)

기술적으로 JTAG는 프로그래밍 방식이 아니라 디버깅 시스템입니다. 여전히 JTAG 인터페이스는 AVR을 지원하는 프로그래밍을 허용합니다.

JTAG는 시스템 내에서 디버깅하는 동안 지원되는 AVR의 상태를 조작하고 검사 할 수있는 시스템 내 디버깅 도구입니다. JTAG를 통해 사용자는 언제든지 실행, AVR의 내부 레지스터 조작 등을 중지 할 수 있습니다.

ATMEL의 공식 JTAG-ICE 장치는 JTAG-ICE MKII로 대체되었습니다.이 JTAG-ICE MKII는 AVR 범위의 DebugWire 디버깅 프로토콜과 ISP 방법을 통한 프로그래밍 (위 참조)에서 더 새롭고 광범위하게 지원됩니다.

JTAG-ICE 클론은 저렴한 가격으로 구입할 수 있지만 소수의 AVR과의 호환성이 제한되어있어 유용성이 제한됩니다. 그럼에도 불구하고 AVR이 JTAG 인터페이스를 지원하는 경우 JTAG-ICE는 매우 훌륭하고 효과적인 디버깅 방법 및 프로그래머입니다.

방법 3 : DebugWire

지원 : 많은 소규모 AVR
지원 프로그래머 : JTAG-ICE MKII, Dragon, AVRONE

다시 DebugWire는 프로그래밍 인터페이스가 아니라 디버깅이지만 프로그램에서 지원되는 AVR로로드하는 데 사용할 수 있습니다. dW 인터페이스는 모든 통신에 단일 AVR 핀 (/ RESET 라인)을 사용하므로 핀 수가 적은 AVR 장치에 이상적입니다.

방법 4 : 부트 로더

지원 : 대부분의 최신 AVR
지원 프로그래머 : N / A

다시 기술적으로 프로그래밍 방법이 아닙니다. 부트 로더는 일반 플래시의 사용자 설정 가능 예약 섹션에있는 작은 AVR 프로그램입니다. 부트 로더는 최신 AVR에서 제공되는 플래시 자체 수정 기능을 사용하여 AVR이 외부 소스에서로드 된 프로그램 데이터를 통해 자체적으로 프로그래밍 할 수 있도록합니다. 부트 로더는 모든 위치 (예 : 외부 데이터 플래시 또는 SD 카드)에서 데이터를 소싱 할 수 있지만 가장 일반적인 유형의 부트 로더는 AVR의 RS-232 (직렬) 포트를 통해 PC와 통신합니다.

부트 로더는 플래시 공간을 소비하고 (AVR 응용 프로그램에서 사용할 수있는 플래시 크기를 제한 함) AVR 퓨즈 비트를 변경할 수 없다는 점에서 제한됩니다.

부트 로더는 인터넷을 통해 다운로드 할 수 있지만 “치킨 앤 에그”문제로 어려움을 겪고 있습니다. 먼저 부트 로더에서 프로그래밍하려면 여기에 나열된 다른 유형의 프로그래머가 필요합니다. 일반적으로 간단한 병렬 포트 동글 (ISP 섹션 참조)을 구성하거나 부트 로더 (예 : AVRButterfly 보드)가 사전로드 된 AVR을 구입하면이 문제를 해결할 수 있습니다.

방법 5 : 고전압 병렬 프로그래밍 (HVPP)

지원 : 대부분의 비 Tiny AVR (예외 포함)
지원 프로그래머 : STK500, STK600, Dragon, Homebrew Dongles, AVRONE

고전압 병렬 프로그래밍은 설정해야하는 번거 로움으로 인해 거의 사용되지 않는 프로그래밍 방법입니다. 그럼에도 불구하고, HVPP 프로그래밍은 일반적으로 다른 프로그래밍 방법을 통해 퓨즈 비트가 잘못 구성된 AVR을 “재활용”하는 데 사용됩니다.

STK500과 Dragon은 모두 HVPP를 지원합니다. HVPP 동안, 타겟의 / RESET 핀은 내부 병렬 프로그래밍 회로와 연결되는 12V의 비정상적으로 높은 값으로 올라갑니다. / RESET 핀은이 수준으로 안전하게 올릴 수있는 AVR의 유일한 핀입니다 (HVPP 지원 AVR에서).

이와 같은 온라인 계획을 사용하여 자체 HVPP 동글을 만들 수 있습니다.

방법 6 : 고전압 직렬 프로그래밍 (HVSP)

지원 : 많은 TINY AVR (예외 포함)
지원 프로그래머 : STK500, STK600, Dragon, Homebrew Dongles, AVRONE

HVSP는 데이터 전송이 병렬이 아닌 직렬로 수행된다는 점을 제외하고는 HVPP와 유사합니다. 이것은 HVPP에 충분한 핀이없는 많은 TINY 시리즈 AVR에서 사용되는 대체 프로그래밍 방법입니다.

방법 7 : PDI

지원 : XMEGA AVR
지원 프로그래머 : STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI는 XMEGA AVR 라인 용 debugWire 프로토콜을 기반으로하는 새로운 프로그래밍 인터페이스입니다. 현재 다른 8 비트 AVR 마이크로 컨트롤러에서는 사용되지 않습니다.

방법 8 : TPI

지원 : 6 핀 TINY AVR (ATTINY10 등)
지원 프로그래머 : STK600, Dragon, AVRISP MKII

TPI는 6 핀 ATTINY10과 같이 핀이 제한된 최신 TINY AVR 라인을위한 매우 작은 프로그래밍 인터페이스입니다. dW와 마찬가지로 TPI는 장치의 / RESET 라인을 통신 인터페이스의 일부로 사용하지만 유사성이 끝납니다. 파인트 크기의 TINY AVR에는 온칩 디버깅 회로가 없기 때문에 TPI 프로토콜은 반이중 프로토콜에서 3 개의 핀으로 구성된 새로운 프로그래밍 인터페이스를 사용합니다. 장치의 RSTDSB 핀을 설정할 때 프로그래밍을 위해 / RESET 라인을 + 12V로 올려야하므로 현재 최신 STK600 프로그래밍 보드에서만 지원됩니다.

보너스 FAQ 섹션!

  1. 가장 좋은 방법은 무엇입니까?
    보편적 인 “최상의”방법은 없습니다. ISP 프로그래밍은 간단하고 매우 인기가 있지만 위의 모든 방법이 작동합니다. 두 가지 고전압 프로그래밍 모드 (장치에 적용 가능)는 퓨즈가 잘못 구성된 AVR을 수리 할 수 ​​있으므로 기능이 가장 풍부합니다. 그러나 이러한 방법은 설정하기 어려우므로 대부분의 사용자가 ISP를 사용하는 이유입니다.

  2. 병렬 포트 동글을 만들었습니다. AVRStudio와 함께 사용할 수 있습니까?
    난 두려워하지. AVRStudio는 “덤 (dumb)”동글과 인터페이스 할 수 없습니다. 마이크로 컨트롤러 자체를 포함하는 스마트 프로그래밍 장치가 필요한 통신 프로토콜을 해독해야합니다. 마이크로 컨트롤러가없는 간단한 동글은 “비트 뱅”(즉, 컴퓨터를 통해 동글을 통해 시뮬레이션 된 적절한 신호) 자체 여야합니다.

  3. 그럼 내 동글은 쓸모 없어?
    아니요. 타사 프로그래밍 소프트웨어 도구로 집에서 만든 동글을 통해 프로그래밍 할 수 있습니다. AVRDude는 훌륭하고 알려진 무료 명령 줄 유틸리티이며 WinAVR 패키지에 포함되어 있습니다.

  4. 프로그래머가 AVRStudio를 사용하도록하려면 옵션은 무엇입니까?
    AVRStudio 지원 프로토콜을 사용하는 프로그래머를 선택하십시오. 이는 간단한 “AVR910″프로토콜 (더 이상 사용되지 않음)이거나 STK500 / AVRISP에서 사용하는 프로토콜의 사용자 정의 구현 일 수 있습니다. 이 프로그래머는 마이크로 컨트롤러가 필요하므로 catch-22 상황이 발생합니다. 이는 구입시 프로그래머의 AVR에 적절한 펌웨어를 사전 프로그램하거나 AVR을 부트 로더로 사전 프로그래밍하여 해결할 수 있습니다.

  5. 좋아, 나는 부트 로더를 사용하고 싶다. 처음부터 어떻게 구할 수 있습니까?!
    AVR에서 부트 로더를 사용하려면 먼저 부트 로더를 프로그래밍해야합니다. 기존 프로그래머가없는 경우 (단순한 멍청한 동글이라도 초기 프로그래밍에는 충분합니다), 또는 여러 공급 업체의 부트 로더.
    Atmel은 또한 MEGA169 AVR에 AVR-Studio 호환 부트 로더가 사전로드 된 Butterfly 데모 보드를 제조합니다.

  6. 도움! ISP를 사용하는 동안 퓨즈가 엉망이되어 AVR을 손상 시켰습니다!
    가장 일반적인 실수는 클럭 선택 퓨즈를 유효하지 않은 설정으로 변경하는 것입니다. AVR의 XTAL1 핀에 외부 시계를 놓아보십시오.
    가능하지 않은 경우 고전압 방법 중 하나를 사용하십시오. 이는 고전압 방법이 프로그래밍을 위해 자체 클럭을 AVR에 제공하기 때문에 클럭 소스를 포함하는 구성 오류를 수정합니다.

  7. 프로그래머와 어떻게 인터페이스합니까?
    프로그래머와 인터페이스하기 위해 사용하는 소프트웨어는 사용중인 프로그래머 유형에 따라 다릅니다.
    간단한 “덤”동글에는 PonyProg 또는 AVRDude와 같은 타사 소프트웨어가 필요합니다. 이것들은 커맨드 라인 또는 GUI 도구 일 수 있습니다-웹을 둘러 보면 귀하의 요구에 맞는 도구를 사용할 수 있습니다.
    AVR910 프로토콜 기반의 프로그래머 및 부트 로더는 AVRStudio 내에서 사용할 수 있습니다. 도구 메뉴에서 “AVRProg”옵션을 선택하여 프로그래머와 인터페이스 할 GUI 화면을 엽니 다. 대안으로 AVRDude와 같은 타사 도구도 AVR910과 호환됩니다.
    공식 툴은 특히 디버깅 변형 (JTAG / Dragon / etc)의 경우 AVRStudio에 긴밀하게 통합되어 있습니다. AVRStudio 도구 메뉴에서 “프로그램 AVR …”하위 메뉴를 선택하고 “연결”항목을 클릭하십시오. 새 창에서 도구 및 해당 연결 인터페이스를 선택하고 확인을 클릭하십시오.
    멍청한 동글 및 AVR910 프로그래머의 경우와 마찬가지로 공식 도구는 타사 프로그래밍 소프트웨어와 함께 사용할 수도 있습니다.

(C) Dean Camera, 2009. 모든 권리 보유. 사전 명시적인 허가없이 AVRFreaks.net 이외의 웹 사이트에서 재생산 할 수 없습니다.

재현 과 함께 물론, 사전 명시 적 동의!


답변

토론에 한 가지 더 추가하고 싶습니다.

SPI는 칩에 매우 일반적인 인터페이스입니다. 3 선은 칩의 선택 핀을 사용하지 않는 SPI 모드입니다.

I2C는 칩 수에 관계없이 2 와이어 만 사용하므로 인터페이스의 주요 경연이며 SPI는 인터페이스 당 다른 와이어가 필요하지만 속도가 느립니다.

가르 칠 때 인터페이스에 대해 가장 중요한 작업 중 하나를 가르치는 것을 고려합니다.

내 정보를 확장하려는 사람들을위한 커뮤니티 위키가 있습니다.


답변

전반적인 관점에서이 인터페이스는 프로그래머와 인터페이스를 지원하는 마이크로 컨트롤러 만 다릅니다. 프로그래머와 마이크로 컨트롤러가 일치하는 한 걱정하지 않아도됩니다.

자세히 살펴보면 인터페이스가 마이크로 컨트롤러에서 더 중요한 핀이된다는 것을 알 수 있습니다. 센서에 이러한 핀을 사용하는 경우 장치를 프로그래밍 할 때 신호가 방해를받을 수 있습니다. 이것이 가장 간단한 해결책은 프로그래밍 중에 센서를 분리하는 것입니다.

일부 인터페이스 (JTAG 포함)를 사용하면 장치를 디버깅 할 수 있지만이를 지원하는 프로그래머 (및이를 구동하는 소프트웨어)가 필요합니다. A의 이전 질문 내가 AVR 장치를 디버깅 드래곤에서 지적되었다 – 내가 하나를 얻을 프로젝트의 내 현재 라운드가 완료 가까워 때 재생하려는.


답변

직렬을 언급 할 때 spi (2 선, 3 선?), usb, jtag, swd 등이 모두 사용됩니다.

예, 장단점이 있습니다. 예를 들어 Jtag는 원래 하드웨어에 내장되어 있고 프로세서 디버깅 이외의 용도로 주로 사용되는 모든 경우에 사용되지만 하드웨어에도 사용됩니다. jtag를 사용할 수 있다면 일반적으로 그 이유로 가장 좋은 인터페이스이지만 예외가 있습니다. 예를 들어 핀이 jtag 전용이 아닌 경우 코드에 버그가 있거나 의도적으로 해당 핀 중 하나를 사용하여 jtag를 사용하여 칩에 액세스 할 수 없도록 할 수 있습니다 (플래시에서 소프트웨어를 부팅하는 경우 해당 핀의 용도를 변경 함). 또 다른 예외는 플래시의 소프트웨어 버그로 프로세서 코어가 중단 될 수 있고 정지 된 코어가 jtag를 통해 디버깅 할 수없는 경우입니다. 나는 그것을 하드웨어 디자인의 버그라고 부를 것이지만, 최근에는 상업적인 부분에서 이것을 다루었 다.

예를 들어 AVR에서 PDI는 사람들이 spi를 호출한다고 생각합니다. pdi와 외부 jtag가 내부적으로 일반적인 pdi 인터페이스에 공급되는 것은 적어도 xmega에 나타납니다. 따라서 pdi 핀을 사용하면 jtag 오버 헤드 대신 이에 직접 액세스 할 수 있습니다. 플래시의 소프트웨어가 핵심을 멈출 때이 인터페이스가 작동하는 한이 제품군에 이상적인 인터페이스입니다. 프로토콜은 게시되고 비교적 간단하며 하드웨어에 내장되어 있습니다. i2c와 같은 양방향 데이터 버스의 단점이 있습니다.

Arm에는 swd라는 와이어 수가 적은 jtag가 있으며 반드시 공개적으로 게시하고 싶지는 않습니다. 오픈 소스 툴이이를 구현하고 있습니다. 이것은 이론적으로 직렬 jtag이며, 다른 jtag 신호는 여러 와이어에서 병렬이 아닌 한 와이어에서 순차적으로 전송됩니다. 부품 내부에서 다시 병렬화되고 정상적인 jtag 로직을 공급한다고 가정합니다. 이것은 ARM이 세미 비밀을 유지하기를 원하고 ARM jtag 디버거가 어쨌든 사용하기에 막대한 고통이라는 단점이 있습니다. 그래서 이것은 많은 작업입니다. openocd가 작동하면 다른 이야기 일 수 있습니다. 또한 용도가 변경된 핀과 중단 된 코어의 발생에 대해 여전히 걱정해야합니다.

여러 공급 업체는 하나 또는 여러 개의 부트 플래시 영역이있는 솔루션을 사용합니다. 핀 또는 2 개 또는 3 개를 당기는 방식에 따라 부팅하는 플래시에 따라 다릅니다. 따라서 사용자 플래시에서 부팅하거나 최소한 공장 출하시 직렬 포트 기반 부트 로더가 있거나 USB 기반 부트 로더가있는 플래시에서 부팅 할 수 있습니다. 각 소프트웨어 공급 업체마다 이러한 소프트웨어 솔루션은 미묘하거나 미묘한 방식으로 직렬 프로토콜이 변경 될 수 있으며 다양 할 수 있으며, USB 솔루션은 약간 변경 될 수 있습니다. 좋은 점과 나쁜 점은 이러한 플래시 중 일부를 얻을 수 있으므로 직렬 부트 로더를 변경하도록 선택할 수 있습니다.이 점은 좋고 나쁩니다. 실수로 지우고 부품을 브릭 킹하려면 최소한 해당 인터페이스 용으로 브릭하십시오.

Jtag 도구는 수천 달러의 비용이 들었지만 지금은 그렇지 않습니다. 약 15 달러에 ftdi 브레이크 아웃 보드를 사용하여 openocd로 용도를 변경할 수 있습니다. $ 50 플러스 또는 마이너스 일부의 경우 openocd와 함께 즉시 사용 가능한 ftdi 기반 USB 솔루션을 얻을 수 있습니다. 비상업적 인 j-link를 $ 75- $ 80에 구입할 수 있습니다. 그리고 빠르지 만 확실히 돈 가치가없는 수천 달러가 있습니다. 당신은 당신이 날려 버릴 현금이 많고 지원 비용을 지불하고자하는 거대한 회사 일 때 그것들을 구입합니다. 가격을 지불하면 원하는 제품을 얻을 수 있으며 기술 지원 질문에 대한 답변을 즉시 얻을 수 있습니다. 예를 들어 무료 리눅스 대 윈도우 또는 RHEL과 마찬가지로 리눅스 지원은 무료이지만 얻는 것을 얻을 수 있습니다. 어쨌든 이것은 jtag를 훨씬 더 매력적으로 만듭니다.

언제 어디서나 디버깅하고 개발할 수있는 무기고 jtag 도구가 있어야합니다. sparkfun은 ftdi 기반 USB- 직렬 보드를 가지고 있으며 ftdi 부품은 큰 뱅커로 용도 변경이 가능합니다. spi 또는 i2c 또는 pdi 또는 jtag 또는 기타 인터페이스에 사용할 수 있습니다. 관심있는 버스 / 부품 용 보드를 가져와 함께 제공되는 무료 / 오픈 소스 소프트웨어를 사용하는 것이 이상적입니다. 또한 이러한 직렬 보드를 사용하면 일종의 직렬 프로토콜이있는 다양한 마이크로의 직렬 포트에 연결하기 위해 3.3V 및 5V (릴리 패드 및 arduino 미니에 사용하는 각 장치에 약 15 달러)의 전원이 이상적입니다. 부트 로더 소스가 게시되고 그들이 지원하는 표준의 상당 부분 인 arduino / avr 사람들과 같은 프로토콜을 기반으로 내 로더를 작성하는 것이 더 쉽다는 것을 알았습니다. YMMV.

요컨대, 좋은 해결책은 없으며 모두 장단점이 있습니다. 적어도 두 가지를 지원할 준비를하십시오. USB 및 직렬 또는 USB 및 jtag 또는 jtag 및 직렬 등. 보드에 패드 나 핀 구멍을 내려 놓고 꼭 채울 필요는 없습니다. 개인 또는 실험실 개발을 위해서는 완전한 도구 모음이 있으며 칩을 브릭하고 보드를 복구해야하거나 자체 부트 로더, USB 펌웨어 등을 개발할 때 서로간에 전환 할 수 있도록 준비하십시오.


답변