태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

USI 의 레지스터들을 살펴 보았다면 어떻게 사용해야 하는지도 확인해 봐야 하겠죠?

MSP430은 CCS에서 사용자가 사용하기 편하도록 헤더파일에 대부분의 구문들이 설정되어 있습니다.

또한 다양한 MSP430 칩이 있지만 USI 인터페이스가 있는 모든 칩들은 다음에 나오는 코딩으로 USI를 SPI Master로 사용할 수 있습니다.

 

1) 전처리기와 전역 변수

  1. #include <msp430.h>
  2.    
  3.    
  4. char mLoopCnt;      // main함수에서 루프 카운터 변수
  5. char mReadData;     // 수신된 데이터 기록할 변수
  6.    

msp430을 사용하기 위해서는 msp430.h를 추가해야 하겠죠?

전역변수는 메인함수에서 사용할 변수들을 미리 설정해 놓았습니다.

 

2) USI 를 SPI 용도로 초기화

USI 레지스터 살펴보기 글을 확인하셨다면 더욱 이해가 쉬울 것 같네요.

다양한 설정이 있겠지만 기본 설정으로 마스터 용도로 설정한 것입니다.

  1. /**
    1.  * @brief USI를 SPI 용도로 설정
    2.  * @remark USI SPI 설정
    3.  */
    4. void Init_USI_SPI(void){
    5. // USI 기본 설정
    6.  USICTL0 |= USIPE7      // SDI 핀을 통신용 Input 으로 설정
    7.          + USIPE6       // SDO 핀을 통신용 Output 으로 설정
    8.          + USIPE5       // SCLK 핀을 Output 으로 설정하여 통신클럭 송신
    9.          + USIMST       // 마스터 모드로 동작
    10.          + USIGE        // 클럭에 상관없이 Shift Data Register 에 있는 비트들이 SDO로 바로 반영
    11.          + USIOE;       // SDO 를 통해 데이터 전송
    12.    
    13. // USI 클럭 소스 선택
    14.  USICKCTL |= USIDIV_1   // Clock / 2
    15.          + USISSEL_2;   // Clock Source = SMCLK
    16.    
    17. // USI 통신 가능
    18.  USICTL0 &= ~USISWRST;
    19. }
    20.    

    주석문을 상세하게 달아 놓았으니 이해하기 쉬우시죠?? 마스터 모드로 설정하였으며 SMCLK / 2 의 속도로 클럭을 설정하였습니다.

    항상 USISWRST을 0으로 설정해야 동작 가능하다는 것만 기억해 두시면 좋겠네요. 1로 설정하면 별 지X을 다해도 동작 안합니다.^^

     

    3) SPI 로 데이터 송신

    저는 간단한 형태로 데이터 송신을 하기 위해서 8비트 데이터만 보내도록 설정하였는데요. 여러분이 필요에 따라 길이를 조정 가능하도록 수정하셔도 됩니다. 조금만 변형해도 쉽게 되니 PASS!

  2. /**
    1.  * @brief USI를 SPI 용도로 사용시 슬레이브로 데이터 송신 목적
    2.  * @return 수신된 데이터 리턴
    3.  * @remark USI SPI 데이터 송신
    4.  */
    5. char Write_USI_SPI(char data){
    6.  char read_data;
    7.    
    8.    
    9.  USISRL = data;         // 송신할 데이터 기록
    10.  USICNT = 8;            // 송신할 비트수
    11.    
    12.  while (!(USICTL1 & USIIFG));   // 데이터 송신 완료까지 대기
    13.    
    14.  read_data = USISRL;    // 수신 데이터 확인
    15.    
    16.  return read_data;      // 수신 데이터 리턴
    17. }

    USISR 레지스터에 송신할 데이터를 기록하고 USICNT 에 송신할 비트 수를 기록하면 송신이 시작됩니다. 

    USICNT가 8부터 1씩 줄어들어 0이 되면 USIIFG 비트가 1이 됩니다. 즉 데이터 송신이 완료되었다는 것이죠.

    현재 대기하는 방식으로 했지만 인터럽트 방식으로 하시면 더욱 좋을 수 있죠.

    마지막으로는 송신을 했으니 슬레이브로부터 데이터가 들어오기도 했겠죠? 그렇죠?? 모르겠다면 SPI란? 글을 참고해 주세요. 

    왜이리 강조하냐면 SPI 송신과 수신이 동시에 발생한다는 것을 잘 이해 못하시는 분이 많이 계시기 때문입니다. RS232C 는 송신할 때와 수신할 때가 서로 다른 시점에 발생할 수 있지만 SPI는 그렇지 않죠.

     

     

    4) SPI 로 데이터 수신

  3. /**
    1.  * @brief USI를 SPI 용도로 사용시 슬레이브로 부터 데이터 수신 목적
    2.  * @return 수신된 데이터 리턴
    3.  * @remark USI SPI 데이터 수신
    4.  */
    5. char Read_USI_SPI(char dummy    ///< Dummy 데이터
    6.         ){
    7.    
    8.  char read_data;
    9.    
    10.  // 슬레이브로부터 데이터를 수신하기 위해 Dummy 데이터를 송신
    11.  read_data = Write_USI_SPI(dummy);
    12.    
    13.  return read_data;      // 수신 데이터 리턴
    14. }

    굳이 Read 함수를 만들지 않아도 되기는 하지만 구분해서 쓰실 분들도 계실 것이라 생각하여 만들어 봤습니다. Write 함수와 다른 점은 전혀 없습니다만 입력 변수에 dummy라는 이름을 써서 쓰레기값을 넣어도 된다고 표시한 것입니다. 굳이 입력하지 않고 함수 내에서 임의의 값으로 설정하시고 사용하셔도 편리하겠죠?

     

     

    5) 메인 함수

    두둥! 이제 마지막으로 main 함수 입니다.

    보시면 아시겠지만 이해하기 쉽도록 별거 안 썼습니다. 메인 루프 들어가기 전에 USI를 SPI 용도로 초기화 하고 메인 루프 내에서 데이터를 송신하도록 하였습니다.

     

  4. /**
    1.  * @brief 메인함수
    2.  * @return 반환값 없음 - 무한 루프
    3.  * @remark 메인 동작 함수
    4.  */
    5. int main(void) {
    6.     WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
    7.      
    8.     Init_USI_SPI();                         // USI를 SPI 용도로 초기 설정
    9.    
    10.     while(1)
    11.     {
    12.         __delay_cycles (1000);              // 1000us 동안 대기
    13.         mReadData = Write_USI_SPI(mLoopCnt++);  // 슬레이브로 데이터 송신 후 수신 데이터 확인
    14.     }
    15.    
    16. }

    가장 쉽게 결과를 확인하는 방법은 두개의 MSP430 보드를 서로 SPI 통신하도록 연결하여 데이터를 관찰하는 것입니다. 마스터에서 데이터를 송신했을 때 슬레이브에서 데이터가 수신이 정상적으로 되는지, 슬레이브의 데이터가 마스터로 송신되는지 확인해 보시면 좋을 것 같습니다.

     

    저의 경우에는 MSP430G2452를 타겟으로 위 코드를 제작하였지만 다른 USI가 있는 MSP430 칩으로도 동일하게 사용 가능합니다.

     

    많은 도움 되셨기를 바랍니다.

Posted by vosami

댓글을 달아 주세요