ADSP-BF506F인 경우에는 3개의 Port modules로 분류할 수 있다
port F/G/H 이다. 다른 ADSP-BFXXX프로세서의 GPIO는 해당 프로세서에 맞게 특화되었지만 제어레지스터는 동일하다.
1) Port F : 16 pins.
(1) PPI data signals.
(2) UART0/1 signals.
(3) SPORT0 signals
(4) SPI0 signals.
(5) CNT0(GP Counter 0) signals.
(6) PWM0 signals.
(7) GP Timer signals.
(8) 부가적인 SPI0/1 slave selects.
(9) GPIOs.
2) Port G : 16 pins.
(1) SPORT1 signals
(2) CAN signals.
(3) ACM signals.
(4) PPI signals.
(5) GP Timer signals.
(6) PWM1 signals.
(7) CNT1(GP Counter 1) signals.
(8) SPI1 signals.
(9) UART0 signals
(10) RSI signals.
(11) GPIOs.
3) Port H : 3 pins.
(1) SPORT1 signals
(2) ACM signals.
(3) SPI0/1 slave select signals.
(4) GP Timer signals
(5) GPIOs.
부가적으로 독립적인 pins로 구성된 TWI signals를 제공한다.
Port의 초기모드는 GPIO Mode이다.
만약 Peripheral기능을 사용하고 싶다면
1. PORTx_FER의 해당 비트를 셋하여 Enable시킴
2. PORTx_MUX로 해당 기능을 선택해 주어야 한다.
하나의 물리적인 포트는 다양한 기능의 입출력으로 사용됨으로 내부 레지스터를 통해 스위칭이 되어야 한다.
floating pin 즉, 입,출력으로 사용하지 않는 GPIO pin은 특별히, pull-up/down해 줄 필요
가 없다.
GPIO로 사용될 경우
(1) 출력으로 사용될 때 :
① SCLK에 동기
② 레지스터
- PORTxIO_DIR : 방향 설정(입/출력, 초기값 입력)
- PORTFIO, PORTGIO, PORTHIO - GPIO data registers이며 쓰기동작에서 동시에 값이 변하므로 주의해야 한다.
- PORTxIO_SET,PORTxIO_CLEAR, PORTxIO_TOGGLE - 비트 단위로 동작하며 그 결과가 위의 GPIO data registers에도 반영되며 이것을 interrupt source로 사용할 수 있다는
것이다. 이때, edge-sensitive pin이 interrupt request를 생성하는 경우에 ISR은 clear
register를 통하여 각각의 GPIO latch를 clearing함에 의해서 그 request를 인정해야 한
다는 것이다. 또한, PORTxIO register는 PORTxIO_INEN register에 의해서 enabling된 input pin의
상태도 반영해 주는 데 주의하기 바란다.
(2) 입력으로 사용될 때 :
① core와 system clocks 사이의 potential latency를 고려해야 한다. 즉, processor에
의해서 입력의 변화가 받아들여지기 위해서는 3 SCLK latency를 가진다.
② 기본적으로 모든 peripheral pins는 reset 이후에 GPIO 입력으로 setting된다. 그러
나, GPIO input drivers는 power 소비를 최소하기 위해서 disabling되어 있다는 데 주의
하자. 그러므로, digial input 또는 interrupt input으로 사용하려면, PORTxIO_INEN
register에서 enabling해 주어야 한다. 만일, enabling해 주지 않는다면, input pins에 변
화가 processor에 의해서 인식되지 않는다. GPIO input enable registers(
PORTFIO_INEN, PORTGIO_INEN, 그리고, PORTHIO_INEN)는 input으로 사용될 임의
의 GPIO에 대한 input buffers를 enable하기 위해서 사용된다. 임의의 GPIO pin의 입력
driver가 enabling되면, 그 GPIO는 더 이상 output으로 작동하지 않는다. 즉, 동일한
GPIO에 대해서 input driver와 output driver를 동시에 enabling할 수 없다.
또한, 외부 pull-up resistors를 사용해 주는 것이 좋다.
(3) Interrupt에 사용될 때 :
각각의 GPIO는 interrupt를 발생하도록 구성될 수 있다. processor는 6개의 interrupt
channels를 통하여 interrupts를 요청하는 최대 35개의 비동기 off-chip signals까지 분별
할 수 있다. 임의의 pin을 interrupt pin으로 만들기 위해서는 해당 PORTxIO_INEN
register 안에 bit가 set되어야 한다. 물론, GPIO 기능을 가지도록 PORTx_FER register
안의 function enable bit는 clear되어 있어야 한다. edge의 경우에 both edge에 대해서
도 사용할 수 있다. interrupt 입력에 대한 triggering 시점은 GPIO polarity registers와
GPIO interrupt sensitivity registers 에 의한 bit별 정의되어 있다.
또한, PORTxIO_DIR registers는 출력으로 구성되어 있을 때, 그 GPIO의 input drivers가
enable 되었다면, software가 data/set/toggle registers에 writing함에 의해서 GPIO
interrupt를 triggering할 수 있다. ISR은 request를 인정하기 위해서는 GPIO를 clearing
해야 한다.
위의 그림은 GPIO interrupt flow이다.
3개의 GPIO modules의 각각은 2개의 독립적인 interrupt channels를 제공하는데, 기능은
동일하고, interrupt A/B라고 불린다. 양쪽의 interrupt channels는 각각의 GPIOs를
none, 어느 하나, 또는 양쪽의 interrupt channels에 할당하는 것을 허락하는 자신만의
mask register를 가지고 있다. 또한, 모든 mask registers는 “0”로 reset되어 있기 때문
에 어떠한 GPIOs도 default에서는 interrupt가 할당되어 있지 않다.
임의의 GPIO interrupt는 그 interrupt를 위한 모든 unmasked GPIOs의 logical OR에 의
해서 발생한다. 예를 들어서, 만일, PF0/1이 GPIO interrupt channel A를 위해서 양쪽이
모두 unmasked되었다면, GPIO interrupt A는 PF0 또는 PF1 어느 하나에 의해서
triggering되었을 때 발생될 것이다. 그러므로, ISR은 실질적으로 interrupt를 발생한
source를 알아내기 위해서 GPIO data register를 check해야 한다.
다음은 지금까지 설명한 GPIO interrupt 처리 routine으로서 임의의 GPIO module의
interrupt A channel에 대한 interrupt flow를 설명한 것이다.
① level-sensitive interrupt로 사용될 때 :
㉠ signal이 pin에 asserting되고, program flow가 interrupt 되는 시간 사이에 최소 4
SCLK cycles의 latency가 존재한다.
② edge-sensitive interrupt로 사용될 때 :
㉠ 총 5 SCLK latency가 필요하다.
㉡ ISR은 GPIO clear register를 통하여 해당 GPIO latch를 clearing하는 부분을 사용
해야 한다.
그 밖에도 PORTxIO_POLAR, PORTxIO_EDGE 그리고, PORTxIO_BOTH registers를 가
지고 있다. default 값은 active high level이며, single edge이다.
댓글 없음:
댓글 쓰기