MSPM0L1306 은 1개의 SPI가 있고 최대 16Mhz로 구동 가능하다.
syscfg 를 사용하면 쉽게 SPI 관련 설정을 할수 있다.
[MSPM0L1306 SSM] 보드는 SSM Type의 표준 핀맵으로 제작 했고 SPI는 PA4(MISO), PA25(MOSI), PA6(SCLK)에 할당되어 있다.
syscfg 로 SPI 핀맵을 설정 설정 할 수 있다.
설정 완료후 저장하면 자동으로 코드가 생성된다. 생성된 코드에서 SPI_Controller_transmitData() 함수로 SPI 데이터를 전송 할 수 있다.
int main(void)
{
unsigned int data[2];
SYSCFG_DL_init();
while (1) {
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
//SPI_WriteRead(0xff);
SPI_Controller_transmitData(data, 2);
delay_cycles(DELAY);
}
}
MSPM0에서 SPI테스트 결과 최대 16Mhz로 출력되고 SPI 전송 지연은 500ns 정도로 측정이 된다. 블록 전송으로 500ns 면 일반적인 MCU 보다는 빠른것 같아 보인다.
기본적인 SPI 통신이 되는것을 확인 했으므로 간단하게 SPI 장치와 통신해서 테이터를 가져오는 테스트를 해 보자.
16bit ADC모듈인 ADS8320 SSM 모듈을 이용하여 16bit ADC 값을 가져오는 테스트가 좋을것 같다.
SPI로 데이터를 송수신 하기위한 함수 SPI_WriteRead() 를 만들어 기존 코드와 호환성을 유지할 수 있다. SPI로 데이터 전송 하는 함수 DL_SPI_transmitData8()와 수신하는 함수 DL_SPI_receiveDataBlocking8()를 이용하여 작성 하였다.
unsigned char SPI_WriteRead(uint8_t data)
{
while (DL_SPI_isBusy(SPI_0_INST));
DL_SPI_transmitData8(SPI_0_INST, data);
return DL_SPI_receiveDataBlocking8(SPI_0_INST);
}
SPI_WriteRead() 함수를 이용해서 ADS8320의 16비트 ADC 데이터를 가져오는 함수 ReadADS8320() 함수를 만들고 16bit ADC값을 UART로 출력하는 테스트 코드를 작성했다.
unsigned char SPI_WriteRead(uint8_t data)
{
while (DL_SPI_isBusy(SPI_0_INST));
DL_SPI_transmitData8(SPI_0_INST, data);
return DL_SPI_receiveDataBlocking8(SPI_0_INST);
}
unsigned short ReadADS8320()
{
unsigned short adc_data;
unsigned char buf[3] = {0,};
DL_GPIO_clearPins(GPIO_GRP_0_PORT, GPIO_GRP_0_PIN_0_PIN);
buf[0] = SPI_WriteRead(SPI_MASTER_DUMMY);
buf[1] = SPI_WriteRead(SPI_MASTER_DUMMY);
buf[2] = SPI_WriteRead(SPI_MASTER_DUMMY);
adc_data = (buf[0] << 14) | (buf[1]<<6) | (buf[2]>>2);
//delayMicroseconds(1); // Minimum of td(CSSC)
DL_GPIO_setPins(GPIO_GRP_0_PORT, GPIO_GRP_0_PIN_0_PIN);
return adc_data;
}
int main(void)
{
unsigned int data[2];
unsigned int gADCResult;
SYSCFG_DL_init();
printf("ADC Test\r\n");
while (1)
{
gADCResult = ReadADS8320();
printf("%d\r\n", gADCResult);
delay_cycles(DELAY);
}
}