본문 바로가기

[Microchip]/dsPIC

[dsPIC33] SPI 테스트

[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 초기화 코드
// 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(디폴트 값)으로
}


dsPIC SPI 송수신 함수
unsigned char SPI1_WriteReadByte(unsigned char Data)
{
 //전송 가능  체크
 while(SPI2STATbits.SPITBF);
 SPI2BUF = Data;     // 데이터 송신

 //수신 대기
 while(SPI2STATbits.SPIRBF == 0);
 return SPI2BUF;     //데이터 수신
}



dsPIC SPI 연결도
다른 MCU와 다르게 MOSI(SDI), MISO(DSO)핀 연결이 반대 이므로 주의 해야 한다.

반응형