회로를 구성한 후 첫번째로 해야할 일은 vs1003안에 있는 control register를 제대로 읽어오는지 확인해 보는 것이다.먼저, SPI를 비롯하여 vs1003과 연결된 GPIO 핀 설정부터 한다. #define VS1003_RESET GPIO_PIN1 #define VS1003_DREQ GPIO_PIN2 #define VS1003_DCS GPIO_PIN3 #define VS1003_CCS GPIO_PIN4 #define VS1003_SCK GPIO_PIN5 #define VS1003_MISO GPIO_PIN6 #define VS1003_MOSI GPIO_PIN7 static inline void vs1003_enable_ccs(void) { gpio_out_reset(GPIO_PORT_A, VS..
이번 프로젝트에서는 임베디드 시스템에서 MP3 파일을 재생하기 위한 vs1003 칩을 다루어보도록 하겠다.VS1003 칩 제조사 홈페이지에 들어가보면 datasheet 문서와 참고 자료를 다운 받을 수 있으므로, 관련 자료를 다운 받은 후 어떤 내용이 있는지 충분히 이해되도록 여러번 반복해서 읽어 본다.Datasheet 첫번째 페이지에 vs1003의 내부에 어떤것들이 들어있는지와 칩 외부로 나오는 핀들에 대한 설명을 한눈에 볼 수 있는 블럭도가 있다. Datasheet에 보면 reference schematic이 제공되므로 직접 하드웨어를 만들수도 있겠지만, 편의상 비교적 저렴한 가격에 구입할 수 있는 상용 제품을 이용하여 프로젝트를 진행하도록 하겠다.이 프로젝트에서 사용하게 될 모듈은 다음과 같은 제품..
앞의 글에서 구성한 회로가 제대로 연결 되었는지 확인해 보기 위하여 nRF24L01 안에 있는 레지스터들의 default 값(reset register value)을 한번 읽어 보기로 하겠다.nRF24L01 모듈은 AVR과 SPI로 연결되어 있으며, 이미 이전에 여러 프로젝트에서 SPI통신을 해보았기 때문에 큰 어려움 없이 nRF24L01의 레지스터 값들을 읽어 올 수 있을것이다. /*============================================================================*/ #define PORTB_REG 0x23 struct port { uint8_t pin; uint8_t ddr; uint8_t port; }; volatile struct port *..
이번에 진행할 프로젝트는 nRF24L01을 이용하여 양방향 무선 통신 시스템을 만들어 보는 것이다.칩 이름에서도 알 수 있듯이 nRF24L01은 2.4GHz 대역의 주파수를 이용하고 있다.당연하지만, 이 칩이 어떤 특징을 가지고 있고, 어떻게 동작되는지 알기 위해서는 제조사의 홈페이지에서 datasheet 문서를 다운받아 자세히 분석하여야 한다.이 프로젝트에 사용할 nRF24L01 모듈은 아래 그림처럼 생겼으며 transmitter, receiver 형식으로 통신할 것이므로 2세트가 필요하다. nRF24L01 칩을 실장한 모듈은 많은 제조사에서 만들어 판매하고 있지만 외부로 나오는 pin 구성은 거의 같다고 보면 되므로 굳이 특정 회사의 제품을 구입할 필요는 없고 가격이나 배송을 고려하여 적당한 제품을 ..
Flash 메모리 프로그램의 첫번째 단계는 'Erase'라고 bootloader 프로젝트에서 이미 언급하였다.Bootloader 프로그램은 Self-programming 방법이므로 page 단위로 erase를 하였으나, ISP에서는 page 단위의 erase 명령어가 없고, chip erase만 제공한다.따라서 ISP 프로젝트에서는 항상 chip erase만 사용하게 된다. #define CHIP_ERASE0 0xAC #define CHIP_ERASE1 0x80 static void erase_chip(void) { cmd_data[0] = CHIP_ERASE0; cmd_data[1] = CHIP_ERASE1; cmd_data[2] = 0; cmd_data[3] = 0; isp_cmd(); _delay_..
이번 글에서는 target CPU의 flash 메모리에 쓰여져 있는 데이터를 읽어 오는 기능에 대해서 설명하도록 하겠다. Bootloader 프로젝트에서는 bootloader 프로그램과 application 프로그램이 동일한 CPU에 존재하기 때문에, 프로젝트가 시작되는 시점에는 application 영역에 의미있는 데이터가 쓰여져 있지 않다. Bootloader program 영역 이외에는 모든 데이터가 0xFF로 읽히게 된다. 따라서 bootloader 프로젝트에서는 flash 메모리 write 기능부터 구현하게 되었다. 그리고, write 된 데이터가 제대로 쓰여졌는지 확인하기 위하여 ISP 장비를 이용하면 되니까 크게 문제 될것이 없었다. 하지만, ISP 프로젝트의 경우에는 write 기능부터 구..
ISP 프로젝트를 위한 회로 구성을 완료한 다음 회로가 제대로 연결되었는지 확인하는 단계를 반드시 거쳐야 한다.먼저 확인할 내용은 PC와 UART가 제대로 연결되었는지, ISP 프로그래머와 target CPU가 SPI로 제대로 연결되었는지 확인을 하여야 한다.입문 과정의 SPI 프로젝트를 이용하여 UART와 SPI 통신 기능을 검증해 보도록 하겠다. static void read_device_info(void) { portb->port &= ~SPI_SS; enter_program_mode(); get_signature(); portb->port |= SPI_SS; } static void port_init(void) { /* SPI port init */ portb->ddr = (SPI_SS | SPI..
ISP 프로젝트를 위한 회로 구성은 다음과 같은 모양으로 할것이다. 입문과정의 SPI 설명글에서는 target CPU를 ATmega328P를 연결하였지만, 이번 프로젝트에서는 ATtiny85를 연결하도록 하겠다. ISP 프로젝트를 진행하기에 앞서 taget CPU의 동작을 먼저 검증해보는 코드를 만들어 보도록 하겠다. ATtiny85의 2번 핀에 LED 하나를 연결하고, 일정한 주기로 점멸하는 코드를 만들어 보기로 하겠다. #define F_CPU1000000 #include #include #define LED0x08 int main(void) { DDRB = LED; PORTB= LED; /* Replace with your application code */ while (1) { PORTB ^= L..
Bootloader 프로젝트에서 별도의 장비없이 UART를 통해서 application 프로그램을 AVR의 Flash memory에 프로그램하는 방법에 대해서 설명하였다. 하지만 bootloader 프로그램 자체는 ISP 장치를 이용하여 프로그램하였다. 이처럼 임베디드 시스템을 처음 만들었을때의 시점에는 이 장치에서 돌아가는 프로그램은 아무것도 없는 상태이다. 즉, bootloader 프로그램조차도 없는 완전한 백지 상태인 것이다. 이러한 백지상태의 시스템에서 동작되어야 하는 첫번째 실행파일을 넣어주기 위해서는 어떠한 형태이든지 장비를 이용할 수 밖에 없게 된다. 대량의 양산 단계에서는 ROM writer 장비를 이용하여 Flash 메모리에 image 파일을 프로그램하겠지만, 임베디드 시스템의 개발 단계..
이번에는 Bootloader 프로그램을 이용하여 현재 application 메모리 영역에 어떤 프로그램이 쓰여져 있는지 읽어 오는 기능을 구현해 보기로 하겠다. 이 기능을 위해서 Bootloader 프로그램에 추가로 구현해 줄 내용은 없다. 이미 앞의 글에서 다루었던 verify 기능을 그대로 이용하면 되기 때문이다. Read 기능을 수행하여 새로운 Hex 파일로 만드는 것은 순전히 PC 프로그램의 기능일 뿐이다. Read 기능이 수행된 모습은 다음과 같다. PC 프로그램을 실행하여 AVR bootloader 프로그램과 커넥션을 맺은 다음, Get ID버튼을 눌러 AVR 정보를 읽어 온다.그 다음 AVR의 application 메모리 영역에서 읽어온 데이터를 어떤 파일로 생성할지 파일을 정한 다음 'Re..