본문 바로가기

어떻게 할까/소프트웨어

Renesas H8SC1527R Self Programming w/ RS-232C #2



이전 글 에 이어, FDT 없이 1527R 에 firmware 를 전송 하는 방법에 대해 이어 나가 보겠습니다.


New Bit Rate Selection

New bit rate 를 쓰는 이유는 1527R 에서는 일반 통신 속도 (9600BPS) 와 달리 펌웨어 전송시엔 제일 빠른 38400BPS 를 사용하여 데이터를 전송하게 됩니다.

그러기 위해서는 다음과 같은 명령어 packet을 전송 해야 하며, 이는 이미 설정된 값을 고정으로 사용되는 듯 합니다.(FDT 에서 고정으로 보내는 값을 사용)


[0x3F][size = 0x07][0x01][0x80][0x01][0xF4][0x02][0x08][0x04][check sum=0x36]


이는 각각 new bit rate 를 선택하는 flag 가 0x3F 가 되며,

size  는 마지막 check sum 과 , size 까지의 header 부분을 제외한 실 데이터의 크기 입니다.

0x01,0x80 이 2 bytes 는 bit-rate 를 말하는 것이며, 이것으로 최고 속도를 설정 합니다.

다음 2bytes 인 0x01,0xF4 는 input frequency 를 의미 합니다.

그리고 다음 1 byte 는 multiplication ratio count 를 의미 하면 0x02 이 사용되고 있습니다.

이 multiplication ratio count 가 2 이므로, 뒤에 2 bytes 는 각각 0x08, 0x04 가 오게 됩니다.


이렇게 packet을 보내게 되면, 응답으로 0x06이 오게 되며, 만약 이 0x06 이 아닌 값이 오면 오류 입니다.

0x06 을 받은 다음 접속을 잠시 끊고 속도를 38600 으로 하여 접속하게 되면 firmware 를 전송 하기 이전 작업 까지 완료가 됩니다.


New Bit Rate Confirm (Confirm Inquiry)

위의 0x3F flag 를 통해 새로운 속도로 접속하게 된 다음, MCU 와의 통신을 확인 하기 위해서는 0x2F 를 전송하여 0x06 이 응답으로 오는지 확인 해야 합니다.

만약 0x3F에 대한 응답이 없거나, 0x06 이 아닌 값이 오게 된다면, 새로운 bit-rate 연결이 실패한 것 입니다.


Erase/Programming Mode

FDT는 자체적으로 MCU 를 지우는 방법을 쓰지 않고, MCU 자체에서 Programming block 을 자동으로 소거 하는 방법을 사용합니다.

그러기에 0x40 flag 를 보내게 되면 1527R 은 자동으로 이미 programming 된 block 을 다 지우게 됩니다.

이때 꽤 시간이 걸리게 되므로 바로 0x06 응답이 오지 않으므로 내부적으로 0x06 이 오거나 다른 응답(오류)가 올떄 까지 기다려야 합니다.


Boot Program Status Inquiry

이 부분 부터는 꽤 중요 합니다.

이미 0x40 으로 Programming Block 이 삭제된 상태에서 0x4F flag 를 보내게 되면 다음 구조의 packet 이 넘어 오게 됩니다.


[0x5F][size of data][status][error code = 0x00 이어야 함][check sum]


Programming 이 가능한 status 는 0x3F 이어야 하며, 다른 값일 경우 programming 이 가능하지 않습니다.

error code 는 반드시 0x00 일떄 다음으로 User MAT Programming 으로 넘어 가게 됩니다.


User MAT Programming

이제 이 부분 부터가 Programming block 을 쓰는 중요한 부분이라 하겠습니다.

먼저 0x43 flag 를 보내 0x06 을 받아야 합니다.

만약 0x43 에 대한 응답이 오지 않거나 다른값(Error)이 온다면 User MAT Programming 이 불가능한 상태 입니다.


MAT programming 은 다음과 같은 Packet 을 전송 해야 합니다.

packet size 는 고정적으로 header(1 byte) + write address(4bytes) + data(128 bytes) + check sum(1byte) 구조를 가지므로 실제 134bytes 의 크기를 가집니다.


[0x50][write address 4 bytes][data ....][check sum]


이로 인해 firmware 가 128 로 나눠 떨어지지 않는다면, 마지막 부분은 모두 NIL(0xFF) 로 채워져 있어야 합니다.

0x50 을 전송 한 다음 제대로 오는 응답은 역시 0x06 이며, 만약 오류가 발생하는 경우는 다음과 같은 구조로 넘어 오게 됩니다.


1번째 flag 는 0xD0 이며, 이 값이 아닌 경우는 다른 오류 입니다.

2번쨰 byte 가 0x11 이면 Check sum 오류, 0x2A 일 경우 쓰려는 주소가 MAT 영역이 아닌경우, 0x53 일 경우는 프로그래밍이 MAT 에 가능하지 않는 물리적인 오류 일 경우 입니다.


이 packet 을 128 bytes 단위로 짤라서 다 보낸 다음 마지막 finalizing 은 다음 packet 으로 전송해 주어야 합니다.


[0x50][0xFF][0xFF][0xFF][0xFF][check sum]


마지막으로 위 packet 을 전송하지 않고 reset 이 발생하거나, 더이상 MAT data 가 전송이 되지 않는다면 1527R 은 MAT Programming block 을 완료하지 않고 정상적인 구동이 불가능 해 집니다.


이로서 1527R 의 Firmware programming 이 완료 됩니다.


Comment

실제 제가 작업시 사용하는 방법은 다음 sequence 를 가집니다.


1) 9600bps 로 COM port 접속 , 0x27 로 Programming Unit Inquiry -> 0x37... 로 시작하는 packet 응답 확인.

2) 0x10 으로 Device Selection 해 줌.

3) 0x11 으로 Clock Mode Selection 을 default 값으로 설정

4) 0x3F 으로 New Bit Rate Selection 후 38400BPS 로 재접속

5) 0x06 을 보내 0x06 응답을 확인.

6) 0x40 으로 Transition Programming/Erase Mode 진입, MAT 영역을 지움.

7) 0x4F 으로 Boot Program Status 를 확인.

8) 0x43 으로 MAT Programming 진입.

9) 0x50 .. packet 으로 write 


이 방법을 차례로 할 경우 대부분 성공을 하며, Windows 는 물론 Linux 에서 모두 동일하게 성공하였습니다.

혹시라도 Renesass 의 firmware를 자체적으로 올리기 위해 노력하시는 분들이 계시다면 제 글이 도움이 되었으면 좋겠습니다.