How-to : 버스 해적, 유니버설 직렬 인터페이스

업데이트 : JTAG와 새로운 펌웨어

우리는 항상 새로운 칩이나 SIM 카드를 인터페이스 할 수 있도록 넋을 잃었지만, 열정은 일반적으로 프로토 타이핑 프로세스에 의해 댐핑됩니다. 모든 칩을 인터페이싱하는 것은 일반적으로 회로를 굽고 코드를 작성하고 프로그래머를 운반하는 회로를 나타냅니다. 어쩌면 프로토 타이핑 PCB조차도.

몇 년 전 우리는 PC 직렬 터미널에서 많은 칩과 이야기하는 유니버설 버스 인터페이스 인 보편적 인 버스 인터페이스 인 첫 번째 ‘버스 해적’을 만들었습니다. I2C, SPI 및 비동기 시리얼을 포함하여 3.3-5Volts에서는 여러 가지 종래의 직렬 프로토콜이 지원됩니다. 추가 ‘원시’2 및 3- 와이어 라이브러리는 소유권 직렬 프로토콜을 거의 인터페이스 할 수 있습니다. 이것이 우리에게 유익한 도구 였음을 고려하면 코드를 정리하고 설계를 문서화하고 사양, 회로도 및 소스 코드로 여기에서 출시했습니다.

개념 개요

버스 해적은 여러 IC 인터페이스 프로토콜에 대한 직렬 터미널 브리지입니다. 컴퓨터의 직렬 터미널에 명령을 입력합니다. 명령은 PC 직렬 포트를 통해 버스 해적으로 이동합니다. 버스 해적은 적절한 프로토콜에서 마이크로 칩에 대화하고 결과를 PC에 반환합니다.

모든 핀 출력 3.3Volts는 5Volt 내약성입니다. 온보드 3.3Volt 및 5Volt 전원 공급 장치는 연결된 칩의 전원을 공급할 수 있습니다. 소프트웨어 구성 가능한 I2C 풀업 저항은 패키지를 완성합니다.

직렬 터미널 인터페이스는 PC, Mac, Linux, Palm 조종사, WinCE 장치 등 모든 시스템에서 작동합니다. Crapware가 필요하지 않습니다. 우리는 USB 장치를 고려했지만, USB는 직렬 포트가있는 핸드 헬드 장치의 상당수와 호환되지 않습니다. 우리는 또한 5Volt 내지각 입력이있는 3.3Volt의 장치를 원했지만 인기있는 관통 홀의 USB 마이크로 콜러는 5Volt 부품 (예 : PIC18FX550)이었습니다.

버스 해적은 현재 고속 인터페이스를위한 3 개의 하드웨어 프로토콜을 사용하며 쉬운 버스 조작을위한 두 개의 소프트웨어 프로토콜 라이브러리를 가지고 있습니다. 각 프로토콜의 이론과 사양은 우리가 여기서 커버 할 수있는 것 이상의 것입니다.

I2C.

느린 2 와이어 버스. Wikipedia는 i2c 배경을 시작하는 데 훌륭한 장소입니다. i2c-bus.org, 로봇 전자, 임베디드 시스템 아카데미 및 Embedded.com에는 존경할만한 I2C 자습서가 있습니다.

스파

기본 3 와이어 버스. Wikipedia는 배경이 있습니다. Embedded.com에는 I2C와의 훌륭한 자습서와 비교가 있습니다.

범용 비동기 수신기 송신기 (UART 또는 직렬)

PC 직렬 포트 프로토콜로서의 외관으로 가장 잘 알려진 시계 및 타이밍 종속 직렬 프로토콜. Wikipedia는 비동기 직렬 프로토콜에 배경을 가지고 있습니다.

원시 2 와이어

이것은 I2C와 유사하지만 ACK 비트가없는 일반 2 와이어 프로토콜 라이브러리입니다. I2C 및이 모드에서 사용 가능한 버스 조작을 사용하여 독점 2 와이어 프로토콜을 많이 형성 할 수 있습니다. 이 라이브러리를 사용하여 SmartCards 또는 Sensirion SHT11 온도 / 습도 센서와 같은 비 I2C 2 와이어 장치와 함께 작동합니다.

원시 3 와이어

이것은 SPI와 유사하지만 하드웨어 모듈의 제약 없이는 일반적인 3 와이어 프로토콜 라이브러리입니다. 이 라이브러리를 사용하여 SparkFun Nokia 6100 LCD Knock OFF와 같은 비 -8 비트 호환 3- 와이어 프로토콜을 사용하는 장치로 작업하십시오. 이 모드에서 사용할 수있는 버스 조작을 사용하여 3 개의 와이어 프로토콜을 많이 형성 할 수 있습니다.

하드웨어

전체 크기의 PCB 배치 이미지 (PNG)를 클릭하십시오. 나사 터미널은 전원 공급 장치에 연결됩니다. 7 개의 핀 헤더의 행은 IO 핀에 연결됩니다. 라벨에도 불구하고 7Volts DC 만 필요합니다.

스파

I2C.

rs232.

B9.

모곡

SDA.

B8.

클록

SCL.

B7

장난

rx.

B6.

CS.

송료법

B5

수산

수산

수산

지면

GND.

GND.

GND.

이 표는 각 버스 모드의 PIN 연결을 보여줍니다. RAW 2 와이어 모드는 I2C와 동일한 핀 구성을 사용합니다. 원시 3 와이어 모드는 동일한 핀 구성을 SPI로 사용합니다.

전체 크기 회로 이미지 (PNG)를 클릭하십시오. 회로 및 PCB는 CADSoft 독수리의 프리웨어 버전을 사용하여 생성됩니다. 프로젝트 아카이브 (ZIP)를 다운로드하십시오.

그림 24FJ64GA002.

우리는 버스 해적에서 PIC24FJ64GA002 마이크로 컨트롤러를 사용했습니다. 이것은 우리가 미니 서버 프로젝트에서 사용한 것과 동일한 칩입니다. 우리가 원하는 모든 일을 할 수있을만큼 충분히 빠릅 었으며 주변 핀 선택 기능을 사용하면 하드웨어 SPI, UART 및 I2C 모듈이 출력 핀을 공유 할 수 있습니다. 각 전력 핀은 디커플링 커패시터 (C12, 13)가 필요하며, MCLR 기능은 핀 1과 3.3Volts 사이의 저항 (R7)을 필요로한다. 사진에는 ​​10UF 탄탈 커패시터 (C3)가 필요한 내부 전압 조정기가 있지만 문제없이 일반 전해 콘덴서를 사용했습니다. PIC24F 튜토리얼 에서이 칩으로 프로그래밍 및 작업에 대해 읽어보십시오. 사진 디버거가없는 경우 몇몇 독자들은 eBay에 $ 40 ICD2 클론을 추천합니다.

사진은 3.3Volts에서 실행되지만 디지털 전용 핀은 5Volt Logic을 인터페이싱하기 위해 5Volt 내지성이 있습니다. 핀 14,15,16,17,18,21 및 22는 디지털만이 데이터 시트를 통해보고 아날로그 연결 유형이있는 핀을 제거하여 알아 냈습니다 (표 1-2, 페이지 11-16). 데이터 시트에 따르면,I2C 핀도 5Volt 내약성이 있습니다. 웹에 대한 충돌하는 정보가 없지만 데이터 시트 Page 230, 파라미터 DI28은 아날로그 회로가없는 24FJ64GA002 I2C 핀의 최대 입력이 5.5Volts입니다.

핀 21 및 22 (RB10 / 11)는 저항기 R4 및 R5를 통해 SDA / SCL을 풀 수 있습니다.

MAX3223CPP.

이 칩은 3.3Volt 직렬 출력을 PC 직렬 포트와 호환되는 +/- 10Volt RS232 신호로 변환합니다. MAX3223CPP는 추가 절전 기능을 갖춘 MAX202의 3-5VOLT 버전이다. 최대 RS232 송수신기는 전하 펌프 (C4,5,7,8) 및 하나의 디커플링 커패시터 (C17)에 대해 4 개의 0.1UF 커패시터가 필요하다. 우리는 모든 것을 위해 동일한 커패시터를 사용했습니다.

우리는 더 이상 사용할 수없는 것처럼 보이지 않는 MAX3223CPP를 사용했습니다. Max3223EEPP +는 DigiKey에서 $ 7의 PIN 호환 최신 버전입니다. 아야! 3223의 절전 기능 중 어느 것도 사용되지 않으므로 가능한 경우 저렴하고 간단한 3.3Volt RS232 트랜시버를 대체해야합니다.

전원 공급 장치

대부분의 칩은 버스 해적의 온보드 3.3Volt 및 5Volt 소모품에서 제공 될 수 있습니다. 5Volts는 공통 7805 조정기 (VR2) 및 2 개의 디커플링 커패시터 (C9,10)에 의해 공급된다. LM317 조정 가능한 레귤레이터 (VR1)는 2 개의 저항기 (R2, 3)를 사용하여 3.3Volts로 설정되며 2 개의 디커플링 커패시터 (C6,7)가 필요합니다. 회로에는 7-10Volt DC 공급 (J1)이 필요합니다.

부품 목록

부분

IC1.
PIC24FJ64GA002-DIP.

IC2.
MAX3223CPP (TRY MAX3223EEPP + 시도)

C3.
10UF 커패시터 (바람직하게 탄탈)

C4-13,17.
0.1uf 커패시터

r1.
330 옴 저항

r2.
240 옴 저항

r3
390 옴 저항

R4,5,7.
2K2 옴 저항

vr1.
LM317.

vr2.
LM7805.

x1.
나사 클램프 (3 단자) * 테스트되지 않은

x2.
DB9 암 커넥터 (직렬 포트) * 테스트되지 않은

icsp, sv3.
.1 “핀 헤더, 이상적인 각도

j1.
전원 잭, 2.1mm 핀

led1.
3mm LED (선택 사항)

펌웨어

펌웨어는 C30 컴파일러의 무료 데모 버전을 사용하여 C로 작성됩니다. 사진 24F 시리즈 소개 에서이 사진을 사용하여 작업하는 것에 대해 알아보십시오. 프로젝트 아카이브 (ZIP)를 다운로드하십시오.

main.c – 사용자 단말기 인터페이스를 처리합니다.

Buspirate.c – 적절한 버스의 동작으로 구문을 변환하는 추상화 루틴.

UARTio.c – 두 하드웨어 UART를위한 IO 루틴.

M_I2C_1.C – [Michael Pearce]의 소프트웨어 I2C 루틴. 우리는 사진 하드웨어 i2c를 작동시키지 못했기 때문에이 귀중한 라이브러리를 사용했습니다. 이 소프트웨어는 I2C 속도 설정을 고려하지 않으며 약 5kHz에서 작동하는 것으로 보입니다.

SPI.C – 하드웨어 SPI 모듈을 구동하는 루틴.

Raw2Wire.c – 소프트웨어 2-Wire 인터페이스 라이브러리.

RAW3WIRE.C – 소프트웨어 3 선 (SPI) 인터페이스 라이브러리.

사용자 입력은 Newline 문자 (Enter)가 감지 될 때까지 4000 바이트 버퍼로 유지됩니다. 입력의 첫 번째 문자가 메뉴 옵션 인 경우 (아래 참조) 메뉴 대화 상자가 표시되며, 그렇지 않으면 데이터가 버스를 통해 보낼 데이터가 파싱됩니다 (구문 참조). 이 코드는 스위치 명령문 및 스파게티 코드의 난처한 수로 구성됩니다.

터미널 인터페이스

장치를 제어하기 위해 정크 소프트웨어를 쓰는 대신 우리는 ASCII 터미널에서 작동 할 직렬 명령 줄 인터페이스를 제공했습니다. 버스 해적은 세 자리 결과 코드와 짧은 메시지가있는 명령에 응답합니다. 코드는 PC 자동화로 염두에두고 생성됩니다. Project Archive (Zip)에는 결과 코드 테이블이 포함되었습니다.

메뉴 옵션

메뉴 옵션은 데이터 전송을 포함하지 않는 단일 문자 명령입니다. 문자를 입력하고 메뉴에 액세스하십시오.

~을 자란 – 명령 및 구문이있는 도움말 메뉴를 표시합니다.

M – 버스 모드 (SPI, I2C, UART, RAW 2 와이어, 원시 3 선)를 설정하십시오. 속도, 극성 및 출력 상태 (모드 종속)에 대한 프롬프트로 즉시 뒤를 이어갔습니다.

버스 속도 : SPI : 30, 125, 250, 1000kHz. I2C : 100, 400, 1000khz. UART : 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200bps. 원시 모드 : 1, 10, 50kHz.

역 시계 설정은 정상의 반대쪽에 유휴 상태를 설정합니다 (일반 SPI : IDLE LOW; 일반 UART : 유휴 상태가 높음) : SPI : 유휴 상태; UART : 유휴 로우.

일부 모드에는 풀업 저항 (Low = Ground, High = Input)과 함께 사용하기위한 선택적 High-Z 출력 모드가 있습니다.

L – 비트 전송 / 수신 순서 : 가장 / 가장 중요한 비트 먼저.

P – SDA / SCL 핀 풀업 저항 토글 (3.3Volts). I2C 및 원시 2 와이어 모드에서만 유효합니다.

o – 숫자 출력 표시 형식을 설정합니다. 터미널은 숫자를 소수, 16 진수 및 이진 ASCII 값으로 표시 할 수 있습니다. 네 번째 형식은 ASCII 형식의 텍스트를 읽는 데 원하지 않고 처리되지 않은 바이트를 보냅니다.

통사론

기본 구문은 버스를 통해 칩과 통신하는 데 사용됩니다. 구문 명령에는 일반적으로 모든 버스 유형에 적용되는 일반 함수가 있습니다.

A / A / @ – 보조 핀을 토글합니다. 자본 “A”는 Aux High, Small “A”세트를 접지로 설정합니다. @ aux가 입력 (높은 임피던스 모드)을 설정하고 핀 값을 읽습니다.

[- 데이터 쓰기 시작. SPI / RAW 3 와이어 : 칩 선택 가능. I2C / RAW 2 와이어 : 시작 조건. RS232 : UART를 열고 수신 된 바이트를 폐기하십시오.

{- Data Witch With Resits를 시작하십시오. [, 제외 : SPI / RAW 3 와이어 : 각 쓰기에 대한 읽기 바이트를 표시하십시오. RS232 : Asynchr 도착시 데이터를 표시합니다멍청이.

] 또는} – 종료 데이터 쓰기. SPI / RAW 3 와이어 : 칩 선택 비활성화. I2C / RAW 2 와이어 : 정지 상태. RS232 : UART를 닫습니다.

R / R – 바이트 읽기. SPI / RAW 3 와이어 : 더미 바이트를 보냅니다. RETUT READ. I2C : ACK와 함께 바이트를 읽습니다. 원시 2 와이어 : 8 비트를 읽습니다. RS232 : 바이트의 UART를 확인하고 반환하거나 비어 있으면 실패합니다. 대량은 최대 255 바이트를 읽는 데 0R1 … 255를 사용하십시오.

0b -이 바이너리 값을 씁니다. 형식은 0B00000000 바이트에 대해서는, 부분 바이트도 괜찮습니다 : 0b1001.

0H 또는 0x -이 16 진수 값을 씁니다. 형식은 0H01 또는 0x01입니다. 부분 바이트는 괜찮습니다 : 0xA. A-F는 소문자 또는 대문자 일 수 있습니다.

0-255 -이 10 진수 값을 씁니다. 0x, 0H 또는 0B가 앞에 가지 않은 모든 숫자는 십진수 값으로 해석됩니다.

또는 공간 – 값 구분 기호. 숫자를 구분하기 위해 Coma 또는 공백을 사용하십시오. 모든 조합은 괜찮습니다. {0xA6,0, 0 16 5 0B111 0haf}.

RAW 2 와이어 모드 및 원시 3 와이어 모드를위한 직접 버스 조작 명령.
^ – 하나의 시계 틱을 보내십시오. 여러 클록 틱에 대해 0 ^ 1 … 255를 사용하십시오.

/ 및 \ – 클럭 레벨 높이 (/)와 낮음 (\)을 토글합니다. 시계 지연 (100US)을 포함합니다.

– / _ – 데이터 상태 높이 (-) 및 로우 (_)를 토글합니다. 데이터 설정 지연 (20us)을 포함합니다.

…에! – 시계로 한 비트를 읽으십시오.

…에 – 데이터 핀 상태 읽기 (클럭 없음).

& – 지연 1us. 여러 지연에 대해 0 & 1 … 255를 사용하십시오.

그것을 사용하십시오

다음은 버스 해적을 행동으로 보여주는 두 가지 예입니다. 터미널은 로컬 에코가있는 ASCII 모드로 설정되어야하며 Windows 직렬 터미널을 사용했습니다. PC 측 직렬 연결은 115200bps, 8N1입니다. 버스 해적은 모든 단일 라인 피드 유형 (0x0A, 0x0D) 또는 둘 다 (Windows 스타일)에 응답해야합니다.

.I2C / SPI – 플래시 24LC1025 EEPROM.

마이크로 칩의 EEPROM은 인기있는 영구 저장 메모리 칩이며, 24LC1025는 I2C 인터페이스가있는 128KB의 저장소가 있습니다. 우리는 빵 보드를 빅 회로 또는 코드 작성없이 테스트 할 수 있습니다.

그림은 버스 해적에 연결된 24LC1025를 보여줍니다. EEPROM은 2.7에서 5Volts에서 5Volts에서 작동하므로 버스 해적에서 3.3Volt 공급을 사용하여 회로에 전원을 공급했습니다. 온보드 SDA / SCL 풀업 저항은 I2C 버스를 높이고 외부 저항의 필요성을 제거합니다. 단일 0.1UF 커패시터는 전원 공급 장치에서 EEPROM을 분리합니다.

설정 I2C 모드

첫째, 우리는 i2c 모드에 대한 버스 해적을 설정하고 풀업 저항을 가능하게합니다. 버스 해적이 현재 소프트웨어 I2C 라이브러리를 사용한다는 것을 고려하면 속도 설정은 실제로 효과가 없습니다.

SPI> M <-ENTER M의 모드 선택 1. 스파 2. I2C. 3. UART. 4. 원시 2 와이어 5. 원시 3 와이어 모드> 2C 용 2 <- enter 2 900 모드 설정 설정 속도 : 1. 100kHz (표준) 2. 400KHz (빠른 모드) 3. 1MHz (고속) 속도> 1 <- 스피드는 실제로 아무것도하지 않습니다 ... 901 속도 설정 202 I2C 준비, P / P에 대한 P / P I2C> P <-enable i2c 풀업 저항기 205 I2C 풀업 I2C>

EEPROM (I2C)에 쓰기

모든 I2C 조작은 시작 조건 {또는 [및 정지 조건을 사용하여 끝} 또는]로 시작합니다. 쓰기는 장치 (1 바이트)를 해결하고 확인 응답 비트 (ACK)를 찾으려고 노력합니다. EEPROM이 응답하면 데이터 위치를 쓸 수 있도록 (2 바이트) 및 데이터 페이로드 (N 바이트)를 보낼 수 있습니다. 버스 해적은 각 쓰기의 끝에있는 ACK를 자동으로 확인하고 각 읽기를 각각 읽습니다.

24LC1025베이스 어드레스는 1010xxy이고, 여기서 xx는 핀 2 및 3의 상태에 의해 계리되고 Y는 읽혀 (1) 또는 쓰기 (0) 모드입니다. 우리는 핀 2와 3을 높이 묶었으며 전체 쓰기 어드레스 1010110을 만드는 것입니다. 첫 번째 데이터 위치 (0 0)에서 장치에 기록을 시작하고 데이터 입력 형식의 혼합을 사용하여 1 ~ 13 번을 기록합니다 (1 … 13). …에

I2C> {0B10100110 0 0 1 2 3 4 5 6 7 8 9 10 0xB 0xc 13} <-i2c 명령 210 I2C 시작 조건 <-bus Start. 220 I2C 쓰기 : 0xA6 GOT ACK : 예 <- ADDRESS 전송 및 ACK 수신 220 I2C 쓰기 : 0x00 GOT ACK : 예 <- 작성 주소 220 I2C 쓰기 : 0x00 GOT ACK : 예 <- 작성 주소 220 I2C 쓰기 : 0x01 ACK : 예 <-data ...에 ... 220 I2C 쓰기 : 0x0D GOT ​​ACK : 예 240 I2C 정지 조건 I2C>

EEPROM (I2C)에서 읽은

24LC1025를 읽는 것은 두 단계를 취합니다. 첫째, 데이터가없는 쓰기 명령은 주소 포인터를 설정합니다. 둘째, 읽기 통신

Leave a Reply

Your email address will not be published. Required fields are marked *