[dsPIC33] SPI 테스트
dsPIC33 SPI 블록도
SPI모드 설정
SPI2CON1bits.SMP = 0; //한 주기 클럭 중간에서 데이터 출력 위상 설정
SPI2CON1bits.CKE = 0; //MODE 0,0 , 클럭이 LOW 상태에서
SPI2CON1bits.CKP = 0; //MODE 0,0 , 데이터 비트 중간에 High
SPI클럭 설정
dsPIC33 SPI 초기화 코드
dsPIC SPI 송수신 함수
dsPIC SPI 연결도
다른 MCU와 다르게 MOSI(SDI), MISO(DSO)핀 연결이 반대 이므로 주의 해야 한다.
![](https://t1.daumcdn.net/cfile/tistory/155C5E484ED6EAB51E)
dsPIC33 SPI 블록도
SPI모드 설정
SPI2CON1bits.SMP = 0; //한 주기 클럭 중간에서 데이터 출력 위상 설정
SPI2CON1bits.CKE = 0; //MODE 0,0 , 클럭이 LOW 상태에서
SPI2CON1bits.CKP = 0; //MODE 0,0 , 데이터 비트 중간에 High
SPI클럭 설정
dsPIC33 SPI 초기화 코드
// SPI 초기화 함수
void SPI1_Init(void)
{
SPI2CON1bits.DISSCK = 0; //내부 시리얼 클럭 사용 설정
SPI2CON1bits.DISSDO = 0; //SPI모듈 SDO2 핀 사용 설정
SPI2CON1bits.MODE16 = 0; //송수신 전송 데이터 크기 : 8비트 설정
SPI2CON1bits.SMP = 0; //한 주기 클럭 중간에서 데이터 출력 위상 설정
//SPI 모드 설정
SPI2CON1bits.CKE = 0; //MODE 0,0 , 클럭이 LOW 상태에서
SPI2CON1bits.CKP = 1; //MODE 0,0 , 데이터 비트 중간에 High
SPI2CON1bits.MSTEN = 1; //마스터 모드 설정
//SPI 보레이트 설정
SPI2CON1bits.PPRE = 1; //16:1
SPI2CON1bits.SPRE = 1; //8:1
SPI2CON2bits.FRMEN = 0; //프레임 모드 사용 중지
SPI2CON2bits.FRMPOL = 0; //프레임 동기 신호 액티브 로우
SPI2CON2bits.FRMDLY = 0; //프레임 동기 신호 첫번째 클럭 비트 전에 발생
SPI2STATbits.SPISIDL = 0; //아이들 모드시에도 계속 SPI 모듈 동작 설정
SPI2STATbits.SPIROV = 0; //수신 오버플로우 발생하지 않음
SPI2STATbits.SPIEN = 1; //SPI 모듈 사용 설정
IFS2bits.SPI2IF = 0; //SPI2 인터럽트 플래그 클리어
IEC2bits.SPI2IE = 0; //SPI2 인터럽트 사용 안함, 폴링 방식
IPC8bits.SPI2IP = 4; //SPI2 인터럽트 우선순위 = 4(디폴트 값)으로
}
void SPI1_Init(void)
{
SPI2CON1bits.DISSCK = 0; //내부 시리얼 클럭 사용 설정
SPI2CON1bits.DISSDO = 0; //SPI모듈 SDO2 핀 사용 설정
SPI2CON1bits.MODE16 = 0; //송수신 전송 데이터 크기 : 8비트 설정
SPI2CON1bits.SMP = 0; //한 주기 클럭 중간에서 데이터 출력 위상 설정
//SPI 모드 설정
SPI2CON1bits.CKE = 0; //MODE 0,0 , 클럭이 LOW 상태에서
SPI2CON1bits.CKP = 1; //MODE 0,0 , 데이터 비트 중간에 High
SPI2CON1bits.MSTEN = 1; //마스터 모드 설정
//SPI 보레이트 설정
SPI2CON1bits.PPRE = 1; //16:1
SPI2CON1bits.SPRE = 1; //8:1
SPI2CON2bits.FRMEN = 0; //프레임 모드 사용 중지
SPI2CON2bits.FRMPOL = 0; //프레임 동기 신호 액티브 로우
SPI2CON2bits.FRMDLY = 0; //프레임 동기 신호 첫번째 클럭 비트 전에 발생
SPI2STATbits.SPISIDL = 0; //아이들 모드시에도 계속 SPI 모듈 동작 설정
SPI2STATbits.SPIROV = 0; //수신 오버플로우 발생하지 않음
SPI2STATbits.SPIEN = 1; //SPI 모듈 사용 설정
IFS2bits.SPI2IF = 0; //SPI2 인터럽트 플래그 클리어
IEC2bits.SPI2IE = 0; //SPI2 인터럽트 사용 안함, 폴링 방식
IPC8bits.SPI2IP = 4; //SPI2 인터럽트 우선순위 = 4(디폴트 값)으로
}
dsPIC SPI 송수신 함수
unsigned char SPI1_WriteReadByte(unsigned char Data)
{
//전송 가능 체크
while(SPI2STATbits.SPITBF);
SPI2BUF = Data; // 데이터 송신
//수신 대기
while(SPI2STATbits.SPIRBF == 0);
return SPI2BUF; //데이터 수신
}
{
//전송 가능 체크
while(SPI2STATbits.SPITBF);
SPI2BUF = Data; // 데이터 송신
//수신 대기
while(SPI2STATbits.SPIRBF == 0);
return SPI2BUF; //데이터 수신
}
dsPIC SPI 연결도
다른 MCU와 다르게 MOSI(SDI), MISO(DSO)핀 연결이 반대 이므로 주의 해야 한다.
반응형