왜 필요한가?
5517 은 각각의 다른 장치들과 통신하기 위해, 아래의 표와 같이 address 와 data bus 를 제공한다.
interface | address | data |
SMI | 14개 | 16개 |
EMI | 24개 | 16개 |
- SMI : 5517 과 SDRAM 이 통신하기 위한 인터페이스로서 최대 2 개까지 지원(chip selecter 2 개)
- EMI : SDRAM 뿐만 아니라, 다른 기타 장치들을 붙일 수 있다. 최대 6개까지 지원(chip selecter 6 개)
위의 표에서 알 수 있듯이 16 bit 로 동작한다는 것을 알 수 있다. 그래서 5517 은 16 bit CPU 이다. 갑자기 이 얘기를 왜 했는지 궁금할 지도 모르겠다. 예를 들어 만일, EMI 에 16 bit 로 동작하는 flash 를 붙였다고 하자!
이때는 5517 과 flash 가 1:1 로 동작할 것이다. 서로 16 bit 로 통신하기 때문이다. 이번에는 32 bit 로 동작하는 7020 을 붙였다고 생각해 보자!
5517 은 16 bit 로 동작하는 데, 반해 7020 은 32 bit 로 동작한다. 과연 어떻게 통신할 것 인가?
이번에는 8bit 로 동작하는 eeprom 을 붙였다고 생각해보자! 과연 어떻게 통신할 것 인가?
언뜻 생각해보기에, 5517 에는 16 bit 가 아닌, 다른 bit 로 동작하는 디바이스는 붙이지 못한다고 생각할 것이다. 하지만, 결론 부터 얘기하자면, 가능하다. 그리고 바로 이때 필요한 것이 'address shift' 이다.
5517 의 EMI 로 부터 나가는 address bus 를 shift 해서 8, 32 bit 각각의 디바이스를 지원한다. 이제 부터는 각각의 상황에 따라서, 5517 을 어떻게 세팅해주어야 하는지에 대해서 알아보도록 하겠다.
32 bit 디바이스 일 때
앞에서 예를 들었던, 7020 은 32 bit 로 동작하는 디바이스이다. 현재 7020 은 EMI bank 2 에 물려 있다. 현재 DAC5000 소스 프로그램의 초기화 루틴을 보면 알겠지만, 먼저
7020 reset → 5517 aux clock setting |
순으로 동작한다. 이 후에 동작은 5517 을 32 bit 모드로 설정하고, 7020 을 16 bit 모드로 세팅한다. 이 때, 소스 코드를 보면 아래와 같다.
STSYS_WriteRegDev32LE(0x20010028, 0x0022003f); // 여기서는 bank 2 address shift 를 0 으로 세팅한다. (EMI_GENCFG[8]) STSYS_WriteRegDev32LE(0x20200028, 0x000006c1); // 여기서는 bank 2 의 address 를 확장한다. (EMI_ADDRESS_EXPANSION)
위에서 특별히 세팅해주지 않은 것들은 모두 mb382_emi.cfg 파일의 설정을 따른다. (port size = 16 bit)
레지스터 세팅이 끝나면, 32 bit 모드로 동작한다. 이 때는 5517 의 EMI_CAS 를 7020 의 BE[3] 에 연결해야 한다. 왜냐하면, 5517 에서 32 bit 의 데이터를 보내려면, 2번을 보내야 한다.
7020 쪽에서는 현재 받아온 데이터가 LSB 인지 MSB 인지 알 수 있는 방법이 없다. 이 때 바로 BE[3] 를 보고 판단하게 된다.
5517 의 EMI_CAS 에서는 LSB 인 경우 LOW 를, MSB 인 경우 HIGH 를 내보낸다. 5517 이 32 bit 로 동작하는지 알아보려면, BE[3] 를 보면 된다.
프로그램에서는 32 bit 로 캐스팅해야 한다. (그러면, 7020_cs 가 두번 뜬다)
32 bit 모드에서는 아래와 표와 같이,
0x00000000, 0x00000001, 0x00000002, 0x00000003 | 0 번지로 출력 |
0x00000004, 0x00000005, 0x00000006, 0x00000007 | 1 번지로 출력 |
출력이 나간다.
32 bit 요약 정리
32 bit 로 동작하기 위해서는 아래의 항목들을 설정해주어야 한다.
- PORT SIZE : 16 bit 세팅
- Address shift : 0 으로 세팅
- EMI_ADDRESS_EXPANSSON : 1 로 세팅
- EMI_CAS 를 7020 의 BE[3] 에 연결
- 프로그램에서 디바이스로의 R/W 시, 32 bit 로 casting 하여 access 함
- BE[3] 가 LOW 에서 HIGH 로 변하면, 32 bit 모드이다.
16 bit 디바이스 일 때
역시 앞에서 예를 들었던 flash 의 경우 16 bit 로 동작한다. 5517 역시 16 bit 모드로 동작하기 때문에, 32 비트 보다는 훨씬 간단하다.
우선, 아래의 항목을 세팅해주어야 한다.
- PORT SIZE : 16 bit 세팅
- Address shift : 1 로 세팅
- EMI_ADDRESS_EXPANSSON : 0 으로 세팅
- EMI_CAS 를 반드시 BE[3] 에 연결할 필요는 없음(이유 : EMI_CAS 가 아무런 역할도 하지 않기 때문)
- 프로그램에서 디바이스로의 R/W 시, 16 bit 로 casting 하여 assess 함 (chip selecter 한번 뜸)
실제로 출력은 아래 표와 같다.
0x00000000, 0x00000001 | 0 번지로 출력 |
0x00000001, 0x00000002 | 1 번지로 출력 |
8 bit 디바이스 일 때
POD 의 경우, 처음에는 16 bit 로 동작했다가, personality change 를 거치면서, 8 bit 로 동작한다. 32 bit 때와 비슷하게 서로 인터페이스 하는 방식이 다르기 때문에, 32 bit 에서의 BE[3] 와 같은 것이 필요하다. 그 것이 바로 BE[1] 이다.
우선 8 bit 세팅을 위해서
- PORT SIZE : 8 bit 세팅
- Address shift : 1 로 세팅
- EMI_ADDRESS_EXPANSSON : 0 으로 세팅
- EMI_CAS 를 반드시 BE[3] 에 연결할 필요는 없음
- 프로그램에서 디바이스로의 R/W 시, 8 bit 로 casting 하여 access 함 (chip selecter 한번 뜸)
- BE[1] 이 HIGH → LOW 로 바뀌면 8 bit 모드로 동작한다고 보면 된다
실제로 출력은 아래 표와 같다.
0x00000000 | 0 번지로 출력 |
0x00000001 | 1 번지로 출력 |
0x00000002 | 2 번지로 출력 |
결론
EMI 에 어떤 디바이스가 붙느냐에 따라서, 위의 설정을 맞춰주면 될 것 같다. 여기서 유의할 것은 32, 8 bit 처럼 5517 과 다르게 통신하는 경우에는 반드시 이를 맞추기 위한 BE[3] 와 BE[1] 패턴이 있다는 것이다.
덧붙여
클럭에 관련한 몇가지 실험을 했었다.
방법은 기존의 타겟보드 인 Ver 2 를 가지고, PLL CLOCK 을 변경해보면서, EMI CLOCK 와 DDR CLOCK 를 보는 것이었다. 실험 결과는 다음과 같다.
PLL CLOCK | EMI_CLOCK | DDR_CLOCK |
300 | 50MHz | 80MHz |
486 | 108MHz | 108MHz |
위의 결과를 보면, PLL CLOCK 를 변경했을 때, EMI_CLOCK 는 변경되지만, DDR_CLOCK 은 변경되지 않는다.