3월, 2025의 게시물 표시

[ BBB - yocto (14) ] SPI(2)

이미지
 0) 개요 VS1003 MP3 디코더를 사용해보자. 참고 문서 : VS1003 Datasheet.pdf 1) VS1003 핀 이름 기능 설명 역할 및 특징 DREQ Data Request 디코딩 준비 완료를 알리는 출력 신호. low 시 vs1003이 동작중인 상태이며, 데이터를 무시한다. XDCS Data Chip Select SDI 프로토콜 전송을 위해 사용될 핀으로 low 시 SDI, high 상태가 idle이다. XCS Command Chip Select SCI 프로토콜 전송을 위해 사용될 칩으로 low시 SCI, high 상태가 idle 이다. XRST Reset 칩 전체를 리셋시키는 핀으로, Low 신호 입력 시 칩이 초기 상태로 설정된다. 주의할 점은 xdcs와 xcs 핀이 동시에 low이면 안됀다. DREQ는 SCI 전송 동작이 끝났을 때 excution 시간 동안 low로 떨어지며, XDCS와 XCS 핀을 사용하는 두 경우 다 공통으로 적용된다. SCI는 레지스터 설정 프로토콜 이고, SDI는 데이터 전송 프로토콜로 보면 된다. 1. SCI SCI는 읽기를 하려면 0x03을 먼저 전송하고, address를 전송한다. 그러면 2바이트 데이터를 얻는다. SCI는 쓰기를 하려면 0x02를 먼저 전송하고, address, data 2바이트를 전송한다. 이렇게 레지스터를 컨트롤한다. XCS를 보면 알겠지만, XCS가 LOW일 때 SCI 프로토콜로 전송된다. 이때 XDCS는 high 신호여야 한다. 2. SDI SDI는 오디오 데이터(mp3, wav, wma, ...등)을 전송해 vs1003 dsp가 mp3를 디코딩하여 변환된 mp3 신호를 오디오 라인으로 재생하게 하는 프로토콜이다. XDCS가 LOW일 때 SDI 프로토콜로 전송된다. XCS 신호는 high 신호여야 한다. SDI의 제어 시퀀스에 대해서는 특별한 설명이 데이터 시트에는 없지만 주의해야 하는게 있다. 1. 비트 레이트와 SPI 클럭 속도를 동일하게 설정해야 올바른 속도로 음...

[ BBB - yocto (13) ] SPI(1)

이미지
 0) SPI 인터페이스 SPI는 슬레이브와 마스터의 개념이 있다. 마스터와 슬레이브는 특정 역할을 갖고 있다. 마스터는 슬레이브에 특정 요청을 전송한다. 슬레이브는 마스터의 요청에 따라 동작을 수행하게 하거나, 슬레이브로 레지스터를 읽어 마스터로 전송하는등의 역할을 한다. SPI는 4개의 핀을 사용한다. MISO : 마스터 인풋, 슬레이브 아웃풋이다. MOSI : 마스터 아웃풋, 슬레이브 인풋이다. CS : SPI는 통신을 하려면 한번에 하나의 칩만 통신하는게 가능하다. SCLK : SPI 클럭으로, I2C와 마찬가지로 클럭을 가지고 통신한다. SCLK는 CPOL CHPA를 갖는다. 1. CPOL : 클럭 극성을 의미한다. (Clock POLarity) 예를 들어 CPOL이 1이면, 클럭이 IDLE 상태에서 HIGH가 된다. CPOL이 0이면, 클럭이 IDLE 상태에서 LOW가 된다.  IDLE 상태는 아무 전송도 이루어 지지 않고 있는 상황이다. 2. CPHA : 클럭 위상을 의미한다. (Clock PHAse) 예를 들어 CPHA 이 1일때, 첫번째로 변화한 엣지를 1번째 엣지라 하면, 클럭의 1, 3, 5, 7 ... 홀수번에서 엣지에서 비트가 변화하며, 2, 4, 6, 8 짝수 엣지에서 비트를 샘플링(읽기)한다.  CPHA 이 1이면,  첫번째로 변화한 엣지를 1번째 엣지라 하면, 클럭의 1, 3, 5, 7 ... 홀수번에서 엣지에서 비트를 샘플링(읽기)하며, 2, 4, 6, 8 짝수 엣지에서 비트를 비트가 변화한다.  MODE CPOL CPHA 설명 MODE1 0 0 상승에지에서 비트를 읽어낸다. 하강에지에서 비트가 변화한다. MODE2 0 1 상승에지에서 비트가 변화한다. 하강에지에서 비트를 읽어낸다. MODE3 1 0 상승에지에서 비트가 변화한다. 하강에지에서 비트를 읽어낸다. MODE4 1 1 상승에지에서 비트를 읽어낸다. 하강에지에서 비트가 변화한다. 여기서 읽기/쓰기...

[ BBB - yocto (12) ] I2C

이미지
0) 준비물 1. mpu 6050 2. MPU-6000-Register-Map1.pdf 3. MPU-6000-Datasheet1.pdf 노드 속성을 알고 싶다면, 아래 사이트에 들어가서 compatible에 맞는 드라이버를 찾으면 된다. https://www.kernel.org/doc/Documentation/devicetree/bindings am33xx의 i2c compatible에 omap4-i2c를 사용하므로 아래 2개 사이트에서 i2c 노드에 대한 설명을 볼 수 있다. https://www.kernel.org/doc/Documentation/devicetree/bindings/i2c/ti%2Comap4-i2c.yaml https://www.kernel.org/doc/Documentation/devicetree/bindings/i2c/i2c-omap.txt  1 ) I2C란? - i2c는 일종의 통신 프로토콜이다. i2c에는 데이터 버스(SDA)와 클럭신호(SCL)가 존재한다. - slave와 master가 있다. 통신을 할 때 Master는 하나만 있을 수 있으며 슬레이브 디바이스는 여러개가 존재할 수 있다. - 정해진 통신 절차를 사용해 통신한다.  - i2c 슬레이브의 주소는 10비트를 사용할 수도 있고, 7비트를 사용할 수 도 있다. - 한번에 여러 바이트를 읽거나 쓸 수 있다. 아래는 데이터의 읽기/쓰기 시퀀스이다. 1. 1byte 동작 - 여기서 쓰기 비트는0, 읽기 비트는 1에 해당한다. 모든 데이터는 클럭에 맞춰서 읽히거나 쓰여진다. - 시작 상태는 SDA(시리얼 데이터 버스)가 HIGH에서 LOW로 떨어지는 것을 의미한다. - 멈춤 상태는 SDA가 LOW에서 HIGH로 올라오는 것을 의미한다. - ACK(acknowledgement) 신호는 응답 문자로 불리며, 신호를 잘 받았다는 말이다. 나중에 TCP/IP 프로토콜을 다룰 것인데, 여기서도 핸드쉐이킹 과정을 거치며 ACK, NACK 신호를 교환한다. - NAC...

[ BBB - yocto (11) ] uart

이미지
 1) 개요 uart 어플리케이션을 작성할 것이다. 참고로 챕터 10에서 우리가 설정한 핀이 핀헤더의 P9 24, 26번 부분이다. 패킷 구조는 간단히 보면 저렇게 되어있다. 여기에 추가로 uart 트랜시버를 사용해서 rs232 혹은 rs422, 485 등으로 변환해서 보낼 수 있는데 그에 따라 조금씩 제어 방식이 달라진다. 스탑비트, 시작 비트는 1바이트를 주로 쓰는데, 스탑비트는 2바이트로 확장해서 쓸 수 있다. 2) termios 구조체 termios.h를 인클루드하면 termios라는 구조체를 사용할 수 있다. 각 맴버 변수들에 대해서 설명하겠다. 우선 플래그에서는 uart에 대해서 패리티, 스탑 비트, 그리고 데이터 비트 수, baud레이트, 흐름제어(CRTSCTS[232, 422 전용]) 등 설정할 수 있다. 1. tcflag_t c_iflag; - input 플래그를 설정한다. 플래그 비트 값 설명 IGNPAR 0000004 패리티 무시 PARMRK 0000010 패리티 오류 표시해둠. 패리티 무시 비트가 설정되면 무시됨 INPCK 0000020 입력 패리티 체크 활성화 INLCR 0000100 줄바꿈 문자'\n' -> '\r'로 변환 IGNCR 0000200 케리지 리턴 '\r' 무시 ICRNL 0000400 케리지 리턴 '\r' -> '\n'으로 변환 IUTF8 0040000 utf8 인코딩 지원 - 이 외에도 여러 플래그들이 있지만 IGNPAR 혹은 PARMRK, INPCK 만 알아둬도 충분할 것 같다. - 자새한 내용은 /usr/include/x86_64-linux-gnu/bits/termios-c_iflag.h를 참조하길 바란다. 2. tcflag_t c_oflag; - output 플래그를 설정한다. - 거의 설정할 일이 없다... - 자새한 내용은 /usr/include/x86_64-linux-gnu/bits/termios-c_ofl...