[PIC32-SM EVM] SPI 테스트
PIC32의 SPI는 최대 25Mhz로 동작하며 8, 16, 32비트로 설정가능하다.
[PIC32-SM EVM] 보드에는 SPI핀이 SPI2 RG6(SCLK), RG7(MISO), RG8(MOSI)에 할당되어 있다.
PIC32 블록도
PIC32 SPI초기화
SPICON 레지스터
SPI모드 설정
PIC32 SPI클럭 설정
PIC32 SPI데이터 송수신 드라이버 함수 작성
가속도 센서 테스트 드라이버
NET-EVM 보드의 가속도 센서는 SPI0, CS ->RB13에 연결되어 있으므로 아래와 같이 드라이버 코드를 작성할 수 있다.
PIC32의 SPI는 최대 25Mhz로 동작하며 8, 16, 32비트로 설정가능하다.
[PIC32-SM EVM] 보드에는 SPI핀이 SPI2 RG6(SCLK), RG7(MISO), RG8(MOSI)에 할당되어 있다.
PIC32 블록도
PIC32 SPI초기화
void SPI0_Init(void)
{
SPI2CONbits.ON = 1; // Enable
SPI2CONbits.FRZ = 0;
SPI2CONbits.SIDL = 0;
SPI2CONbits.DISSDO = 0;
SPI2CONbits.MODE32 = 0;
SPI2CONbits.MODE16 = 0; //8비트 모드
//SPI 모드 설정
SPI2CONbits.SMP = 0; //위상 설정
SPI2CONbits.CKE = 1; // 0: Idle에서 active로 갈 때 data transaction 1: 반대
SPI2CONbits.SSEN = 1; // Slave select enable
SPI2CONbits.CKP = 0; // 0: active high 1: 반대
SPI2CONbits.MSTEN = 1;
SPI2STATbits.SPIROV = 0; //수신 오버플로우 초기화
SPI0_SetSpeed(SPI_SPEED_4MHZ);
}
{
SPI2CONbits.ON = 1; // Enable
SPI2CONbits.FRZ = 0;
SPI2CONbits.SIDL = 0;
SPI2CONbits.DISSDO = 0;
SPI2CONbits.MODE32 = 0;
SPI2CONbits.MODE16 = 0; //8비트 모드
//SPI 모드 설정
SPI2CONbits.SMP = 0; //위상 설정
SPI2CONbits.CKE = 1; // 0: Idle에서 active로 갈 때 data transaction 1: 반대
SPI2CONbits.SSEN = 1; // Slave select enable
SPI2CONbits.CKP = 0; // 0: active high 1: 반대
SPI2CONbits.MSTEN = 1;
SPI2STATbits.SPIROV = 0; //수신 오버플로우 초기화
SPI0_SetSpeed(SPI_SPEED_4MHZ);
}
SPICON 레지스터
SPI모드 설정
PIC32 SPI클럭 설정
PIC32 SPI데이터 송수신 드라이버 함수 작성
SUINT SPI0_WriteReadByte(SUINT Data)
{
//SPI포트로 데이터 출력
SPI2BUF = Data;
while( !SPI2STATbits.SPIRBF); // 전송대기
//데이터 수신
return SPI2BUF;
}
{
//SPI포트로 데이터 출력
SPI2BUF = Data;
while( !SPI2STATbits.SPIRBF); // 전송대기
//데이터 수신
return SPI2BUF;
}
가속도 센서 테스트 드라이버
NET-EVM 보드의 가속도 센서는 SPI0, CS ->RB13에 연결되어 있으므로 아래와 같이 드라이버 코드를 작성할 수 있다.
#define _SPI0_ENABLE 1
//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE 1
#define MY_ACCEL3LV02_I2C_MODE 0
#define ACCEL_CS_BIT BIT13
#define ACCEL_CS_PORT LATB
#define ACCEL_CS_INIT() (TRISBbits.TRISB13 = 0)
#define ACCEL_CS_ASSERT() Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT() Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT() SPI0_Init()
#define ACCEL_Read SPI0_WriteReadByte
#define ACCEL_Write SPI0_WriteReadByte
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE 1
#define MY_ACCEL3LV02_I2C_MODE 0
#define ACCEL_CS_BIT BIT13
#define ACCEL_CS_PORT LATB
#define ACCEL_CS_INIT() (TRISBbits.TRISB13 = 0)
#define ACCEL_CS_ASSERT() Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT() Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT() SPI0_Init()
#define ACCEL_Read SPI0_WriteReadByte
#define ACCEL_Write SPI0_WriteReadByte
//-----------------------------------------------------------------------------
반응형