5517 은 각각의 다른 장치들과 통신하기 위해, 아래의 표와 같이 address 와 data bus 를 제공한다.
interface | address | data |
SMI | 14개 | 16개 |
EMI | 24개 | 16개 |
위의 표에서 알 수 있듯이 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 을 어떻게 세팅해주어야 하는지에 대해서 알아보도록 하겠다.
앞에서 예를 들었던, 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 로 동작하기 위해서는 아래의 항목들을 설정해주어야 한다.
역시 앞에서 예를 들었던 flash 의 경우 16 bit 로 동작한다. 5517 역시 16 bit 모드로 동작하기 때문에, 32 비트 보다는 훨씬 간단하다.
우선, 아래의 항목을 세팅해주어야 한다.
실제로 출력은 아래 표와 같다.
0x00000000, 0x00000001 | 0 번지로 출력 |
0x00000001, 0x00000002 | 1 번지로 출력 |
POD 의 경우, 처음에는 16 bit 로 동작했다가, personality change 를 거치면서, 8 bit 로 동작한다. 32 bit 때와 비슷하게 서로 인터페이스 하는 방식이 다르기 때문에, 32 bit 에서의 BE[3] 와 같은 것이 필요하다. 그 것이 바로 BE[1] 이다.
우선 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 은 변경되지 않는다.