[DSP280x-M EMV]SPI 테스트 - 3축 가속도 센서(LIS3LV02) 데이터 로깅
TMS320F2808 의 SPI통신을 이용하여 3축 가속도 센서 LIS3LV02를 테스트 했다. 확장 테스트 보드에 가속도 센서를 장착할 수 있기 때문에 쉽게 테스트 가능하다.
TMS320F2808에는 4개의 독립적인 SPI포트가 있는데 이중 표준커넥터로 뽑아둔 SPIA(P16~P19)를 이용한다.
확장 보드에서 LIS3LV02는 SPI포트에 연결되어 있고 CS핀은 P22에 연결되어 있다.
PC 호스트 프로그램
TMS320F2808 3축 가속도 센서 테스트 동영상
DSP280x-M SPI테스트를 위해 Code Composer Studio에 SPI관련 소스 및 가속도 센서 코드 추가
TMS320F280x SPI블럭도
SPI Mode설정
LIS3LV02제어를 위해서는 SPI Mode0로 설정해야한다. SPICCR, SPICTL레지스터에서 설정할 수 있다.
SPI 설정
SPI클럭 속도 설정
SpiaRegs.SPIBRR 레지스터에서 설정 가능하다.
TMS320F2808 3축 가속도 센서 테스트 소스
TMS320F2808 의 SPI통신을 이용하여 3축 가속도 센서 LIS3LV02를 테스트 했다. 확장 테스트 보드에 가속도 센서를 장착할 수 있기 때문에 쉽게 테스트 가능하다.
TMS320F2808에는 4개의 독립적인 SPI포트가 있는데 이중 표준커넥터로 뽑아둔 SPIA(P16~P19)를 이용한다.
확장 보드에서 LIS3LV02는 SPI포트에 연결되어 있고 CS핀은 P22에 연결되어 있다.
PC 호스트 프로그램
TMS320F2808 3축 가속도 센서 테스트 동영상
DSP280x-M SPI테스트를 위해 Code Composer Studio에 SPI관련 소스 및 가속도 센서 코드 추가
TMS320F280x SPI블럭도
SPI Mode설정
LIS3LV02제어를 위해서는 SPI Mode0로 설정해야한다. SPICCR, SPICTL레지스터에서 설정할 수 있다.
SPI 설정
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; //SPI MODE0
//SPI 초기화
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPILBK = 0; //루프백 비사용
SpiaRegs.SPICCR.bit.SPICHAR = 7; //8비트 모드
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Ready to transmit
SpiaRegs.SPICTL.bit.SPIINTENA = 0; //인터럽트 비사용
SpiaRegs.SPICTL.bit.TALK = 1; // Transmit enable
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //SPI마스터 모드
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; //SPI MODE0
SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0; //Overrun interrupt disable
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; //SPI MODE0
//SPI 초기화
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPILBK = 0; //루프백 비사용
SpiaRegs.SPICCR.bit.SPICHAR = 7; //8비트 모드
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Ready to transmit
SpiaRegs.SPICTL.bit.SPIINTENA = 0; //인터럽트 비사용
SpiaRegs.SPICTL.bit.TALK = 1; // Transmit enable
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //SPI마스터 모드
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; //SPI MODE0
SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0; //Overrun interrupt disable
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
SPI클럭 속도 설정
SpiaRegs.SPIBRR 레지스터에서 설정 가능하다.
//SPI 클럭속도 설정
SPI0_SetSpeed(SPI_SPEED_4MHZ);
SPI0_SetSpeed(SPI_SPEED_4MHZ);
//SPI GPIO초기화
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up on GPIO19 (SPISTEA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
EDIS;
//SPI FIFO 초기화
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up on GPIO19 (SPISTEA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
EDIS;
//SPI FIFO 초기화
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
TMS320F2808 3축 가속도 센서 테스트 소스
void main(void)
{
short data = 0;
unsigned int flag = 0;
//DSP System Initialize
SystemInit();
Led1Init();
Led1On();
DebugInit(BAUD_57600);
DebugPrint("SPI Test\r\n");
myAccel3lvInit();
myAccel3lvWrite(CTRL_REG1, 0xD7); //1000.0111 Power on, enable all axis, self test off
myAccel3lvWrite(CTRL_REG2, 0x40);
while(1)
{
if(DebugIsByte())
{
switch(U0_GetByte())
{
case '0':
Led1Off();
DebugPrint("LED OFF\r\n");
break;
case '1':
Led1On();
DebugPrint("LED ON\r\n");
break;
case 'h':
DebugPrint("device_id=");
U0_PutInt(myAccel3lvRead(WHO_AM_I));
break;
case 'r':
GetAccelValue(AXIS_X, &data);
U0_PutInt(data);
break;
}
}
{
short data = 0;
unsigned int flag = 0;
//DSP System Initialize
SystemInit();
Led1Init();
Led1On();
DebugInit(BAUD_57600);
DebugPrint("SPI Test\r\n");
myAccel3lvInit();
myAccel3lvWrite(CTRL_REG1, 0xD7); //1000.0111 Power on, enable all axis, self test off
myAccel3lvWrite(CTRL_REG2, 0x40);
while(1)
{
if(DebugIsByte())
{
switch(U0_GetByte())
{
case '0':
Led1Off();
DebugPrint("LED OFF\r\n");
break;
case '1':
Led1On();
DebugPrint("LED ON\r\n");
break;
case 'h':
DebugPrint("device_id=");
U0_PutInt(myAccel3lvRead(WHO_AM_I));
break;
case 'r':
GetAccelValue(AXIS_X, &data);
U0_PutInt(data);
break;
}
}
반응형