이번엔 PSOC4로 SGPIO 출력을 구현해 보겠습니다.
이전에 PSOC_5LP 에서 만들어 보았던 회로와 구성은 똑같습니다.
하지만 PSOC4는 UDB(Universal Digital Blocks)가 4개 밖에 없는데,
TCPWM 4개가 UDB에 포함되어있지 않아서, 만약 TCPWM을 적절하게 사용한다면
PSOC-5LP 만큼은 못하지만 충분히 여러가지 기능들을 구현할 수 있습니다.
또한 PSOC4는 UART/I2C/SPI 등, 어떤 특정 기능의 핀을 바꿀 수 없었습니다.
UDB로 새로 만든 기능은 임의로 핀을 지정해서 입출력핀으로 사용할 수 있지만,
이미 내장된 기능의 핀은 특정 위치로 바꿀 수 없었던 것이 PSOC-5LP와의 차이점으로 보입니다.
(아직도 PSOC을 배워가는 중이라서 이렇게 표현합니다)
SGPIO 출력의 주요 기능은 다음과 같습니다.
1. Trigger 입력으로 동작하는 특정 갯수만큼 펄스 발생회로.(SHFT CLK)
2. Shift Register
3. Shift Register Load 신호와 CLK신호 (Load 입력 신호에 CLK입력도 넣어 줘야 load 기능 동작함)
4. SHFT CLK(load CLK + SCK) 에서 SCK만 추출해서 SCK를 출력
[ 주요 기능은 SCK에 동기된 SDO 출력입니다. ]
다음은 PSOC Creator 3.3 에서 TopDesign.cysch 탭에 회로도를 그린 내용입니다.
[회로도만 자세히...]
이 회로는 ..
1. Control_Reg_1 의 신호를 0->1로 하여, Trigger 신호를 PWM_1 에 주면,
2. PWM_1 은 입력 클럭의 2(load clk) + 24x2 클럭 만큼 line 출력이 Low였다가 High 바뀝니다.
3. line 출력이 Low->High 로 바뀌는 순간 stop 신호로 rising Edge 입력에 의해 PWM_1 component가 자동으로 멈춥니다.
4. 이 line 출력을 AND 로직으로 CLK과 비교해서 출력 하면 좋겠지만, AND 로직이 CLK입력을 바로 입력 받을 수 없다고
ERROR 을 띄워서 NOT+AND+D-FF를 써서 2분주해서 SCK 출력을 만들어야 했습니다.
만약 AND 입력으로 CLK를 받을 수 있다면 좀 더 빠른 SCK를 만들 수 있겠습니다만, 방법을 못 찾아서 Cypress에 문의해 두었습니다.
5. SCK_MASK 회로(MUX[2:1],Basic_Counter_1,DigitalComp_1)는 load clk+sck 에서 sck만을 걸러내기 위해 만든 회로입니다.
이 신호를 NOT 로직으로 반전하면 Load 신호가 됩니다. 그런데 Shift_Register에 load신호를 주기 위해서 load(High)신호와 1CLK를 동시에 입력해 줘야 load 신호가 동작하기 때문에 처음부터 PWM 에서 CLK 신호를 1개 더 만들었던 것이고, 여기에서 실제 출력할 SCK를 걸르려면 load clk를 빼기위한 신호가 필요했습니다.
main.c 프로그램 소스는 다음과 같습니다.
int main()
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
PWM_1_Start();
ShiftReg_1_Start();
ShiftReg_1_WriteRegValue(0x00800001); // 1-Shift value
Control_Reg_1_Write(0x01); // Trigger
Control_Reg_1_Write(0x00);
ShiftReg_1_WriteData(0x00800002); // 2-Shift Value
Control_Reg_1_Write(0x01); // Trigger
Control_Reg_1_Write(0x00);
for(;;)
{
/* Place your application code here. */
}
}
위 소스 코드에서 보면 출력이 워낙 빨리 나가서, 다 나갔는지 체크하는 내용은 뺐습니다. 트리거 하고 다음 쉬프트 값 쓰는 동안 이미 출력은 나가버렸습니다. ^^
다음은 위의 설명에 따른 출력을 오실로 스코프로 보시겠습니다.
Shift 값 0x00800001 과 0x00800002 가 제대로 출력 되었음을 알 수 있습니다.