[HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 속성 강의 강좌] 10강. SPI 통신(VS1003 음성코덱)

แชร์
ฝัง
  • เผยแพร่เมื่อ 20 ก.ย. 2024
  • ▷▶▷▶ 23년 봄 맞이 정기세일을 진행합니다. 전 품목 4월 한달 간 20% 할인된 금액으로 만나보실 수 있습니다. 많은 관심 부탁드립니다. (선착순 20대 한정) ◀◁◀◁
    smartstore.nav...
    ※ 영상에서 사용되는 실습 보드는 별도 구매하실 수 있습니다.
    smartstore.nav...
    안녕하세요 M-HIVE ChrisP 입니다.
    "HAL 드라이버, CubeMX, TrueSTUDIO를 이용한 STM32F4 속성으로 따라하기" 동영상 강좌 입니다.
    본 영상은 "10강. SPI통신 (VS1003 음성코덱)" 으로
    - SPI 통신 개념
    - 1:1 또는 1:N 통신시 선 연결
    - SCLK, MOSI, MISO, CS의 의미와 역할
    - 전이중 통신의 개념
    - 클럭의 극성과 위상
    - 통신의 대상을 선택하는 방법
    - SPI 통신의 타이밍 시퀀스
    - VS1003 음성코덱 동작 방법
    - CubeMX로 SPI2 설정
    - HAL_SPI_TransmitReceive() 함수 설명
    - VS1003.c 및 h 파일 추가 및 코드 설명
    - MP3Sample.h 파일 추가
    - MP3 파일의 헤더를 포함한 배열의 내용을 코덱으로 전송하여 음악 재생
    - 배열의 길이를 확인하는 방법
    많이 시청해주세요~

ความคิดเห็น • 44

  • @seyoungbaik8141
    @seyoungbaik8141 4 ปีที่แล้ว +1

    강의 정말 감사합니다 ! ! ! !! !!

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว

      ㅎㅎ 좋게 봐주셔서 감사드려요~ 계속해서 즐거운 STM32 개발 되시기 바랍니다 :)

  • @박동진-y9q
    @박동진-y9q 5 ปีที่แล้ว +1

    강의 정말 유용했습니다. 감사합니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      감사합니다! 제 강의가 도움이 되었으면 좋겠네요! :)

  • @AppaFPV
    @AppaFPV 6 ปีที่แล้ว +1

    멋지다

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  6 ปีที่แล้ว +1

      감사합니다! 이거 촬영만 5시간 한거같아요 ㅎㅎ 하다가 맘에 안들어서 다시 찍고를 몇번 반복했는지...ㅜㅜ 지금 올린거도 맘에 완전 들진 않는데 목에서 피토할거같아서 어쩔수없이 올렸습니다 ㅠ 쉽지않네요 ㅎㅎㅎ

  • @강민호-p1e
    @강민호-p1e 4 หลายเดือนก่อน

    유익한 강의 감사드립니다. 하나 질문이 있습니다. 만약 17비트의 데이터를 받고자한다면 어떻게 해야하나요? 몇번 시도를 해보았지만 데이터 수신이 잘 되지않습니다...8비트를 3번 나눠서 받은 다음 값들을 비트시프트 시겨주는 방식으로 했는데....값이 잘 읽히지가 않ㅇ습니다...ㅠㅠ

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 หลายเดือนก่อน

      안녕하세요! 말씀하신대로 8비트씩 3번에 나눠서 읽어들이면 될 것 같습니다. 근데 값이 제대로 읽히지 않는다면, (센서 등)송신측에서 어떤 형식으로 데이터를 보내주는지부터 다시 확인해보셔야 할 것 같습니다. MSB나 LSB중 어떤걸 먼저 송신하는지, 1바이트나 2바이트 중 어떤 단위로 전송하는지, 그리고 데이터가 left aligned인지 right aligned 인지 등을 확인한 후에 그에 맞게 데이터 디코딩을 해주어야 합니다.

  • @josephahn2624
    @josephahn2624 6 ปีที่แล้ว

    안녕하세요.
    질문 하나 더 드립니다.
    I2C는 HAL_I2C_Mem_Read 라는 함수가 있어서 슬레이브 모듈의 레지스터 주소까지 접근할 수 있게 되어 있는데,
    SPI는 슬레이브 모듈의 레지스터에 접근하는 함수가 없습니다.
    SPI통신으로 슬레이브 모듈의 특정 레지스터로부터 값을 읽거나 쓰려면, 어떤 식으로 해야 되나요?
    감사합니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  6 ปีที่แล้ว

      보통 SPI로 인터페이스하는 장치의 내부 레지스터에 어떤 값을 쓰려면 두번에 걸쳐 나눠서 보내주는게 일반적인 방법입니다. 예를들어 0x51의 레지스터에 0x33이라는 값을 써야한다면
      uint8_t TxData = 0x51;
      HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&TxData, &RxData, 1, 10);
      TxData = 0x33;
      HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&TxData, &RxData, 1, 10);
      이런식으로 말이죠.
      이건 통상적인 방법이고 장치마다 다를수도 있는데, 장치의 데이터시트에 레지스터에 값을 읽거나 쓰는 방법이 나와있을겁니다. 그걸 참고하셔서 작성하시면 됩니다!

  • @hasanakkoc6584
    @hasanakkoc6584 5 ปีที่แล้ว

    Hii Chris,Can you explain how we can develop sensor library with I2C and SPI communication protocol with example in two lecture? For All videos Thank You.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      Hello Hasan.
      I'm so sorry I can't help you for the sensor interface because each sensor has different protocol.
      I can't explain about various sensor. That's why I only explain the basic concept of I2C and SPI.

  • @phillipkim2864
    @phillipkim2864 5 ปีที่แล้ว +1

    유익한 강의 감사합니다! 질문이 있습니다.
    static uint16_t VS1003_SPI_ReadWriteByte(uint16_t TxData)
    {
    uint8_t RxData;
    HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&TxData, &RxData, 1, 10);
    return RxData;
    }
    이 함수에서 매개변수가 16비트로 되어 있는데 실제 함수를 호출할 때 던져준 변수는 8비트라서 조금 혼동됩니다.
    예를 들어 이 함수가 8비트 데이터 0을 전달받았다면, 그 0은 16비트로 형변환되서 TxData에 잠시 저장되고..
    TxData의 주소를 8비트형 주소로 바꿔서 hal 함수에 넘겨줘서.. hal 함수에서 이 주소를 참조해서 최종적으로
    0이 모듈에게 전달된다..
    이런 흐름인가요? 그러면 처음부터 매개변수를 uint8_t TxData로 했으면 할함수 호출할 때
    명시적형변환 안해도 될것같은데.. 왜 16비트로 하신거에요?

  • @도로동-h1y
    @도로동-h1y 6 ปีที่แล้ว +1

    CPOL CPHA 설정 관련해서 궁금한점이 생겼는데요, VS1003 데이터 시트상으로 봤을때 SCLK 가 앞부분에 설명해주신 CPOL= LOW로 보이는데 왜 HIGH 로 하신건지 자세히 알수 있을가요 ?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  6 ปีที่แล้ว

      아 좋은질문 해주셨네요. 데이터 시트상에는 클럭의 상승엣지에서 데이터 전송이 된다고 나와있습니다. 사실 그 부분이 중요한데요, CPOL=LOW 이든 HIGH 이든 사실 생각해보면 크게 상관이 없는것 같습니다.어찌되었든 상승엣지에서 데이터가 전송된다는게 중요하죠.
      그래서 CPOL=LOW, CPHA=1EDGE로 하든 CPOL=HIGH, CPHA=2EDGE로 하든 두 경우 모두 상승엣지에서 전송이 일어나는 방식이라서 통신은 문제없이 잘 되는것 같습니다. 그래도 확실히 하려면 CPOL=LOW, CPHA=1EDGE 이렇게 해주는게 좋긴 좋겠죠.
      비단 VS1003만 그런게 아니고 대부분의 SPI 통신의 경우에 해당합니다.

    • @도로동-h1y
      @도로동-h1y 6 ปีที่แล้ว

      샤프꺼 엘씨디좀 키려고 하는데.. 이리저리 자료 검색해봐도 기본이 없어서 그런지 너무 어렵네요 ㅠ 3ㅠ 혹시 조언해주실것좀 있을까요 ? spi통신으로 뭐라도 켜보고싶네요 ㅠㅠ

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  6 ปีที่แล้ว

      DongGi Lee 아.. 샤프꺼 엘씨디 저도 예전에 구동시켜보려고 했었는데 샤프는 기술지원이 안된다고 하더라구요. 자료도 공개된게 별로 없어서 구동하기 위한 주변회로나 필요한 IC의 정보도 찾기가 힘들었던걸로 기억합니다. 꼭 샤프꺼 LCD를 쓰셔야하는 이유가 있나요? 그게 아니라면 다른 TFT-LCD중에 SPI로 구동하는게 있는데 그걸 사용하시면 어떨까 싶습니다~ 그게 정신건강에 이로울거 같아요 ㅠㅜ

    • @bro_c_coli
      @bro_c_coli 3 ปีที่แล้ว

      어우, 저도 데이터시트상 보이는 부분과 설명하셨던게 달라서 혼란이왔었는데 ㅎㅎ 역시 물어보신분이 있었어...

  • @peacem5153
    @peacem5153 4 ปีที่แล้ว

    안녕하세요 강의 잘듣고 있습니다.제가 구현하고자하는 기능은,, stm32f777i 칩과 ads1278 4개 spi 통신(adc당 8채널이며 총 32채널)하여 eth으로 pc로 연결해서 데이터 전송하는 건데요.(이미 보드로 구현이 되는 상황(제가 FW코딩한게 아님)인데 stcube로 다시 해보려고합니다.)여기 강의에서 10강 spi 통신, 12강 eth 강의를 활용하면 가능할까요?7강 adc with dma는 dma연결이라 좀 다른거같더라구요..

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว

      안녕하세요! 네 말씀하신대로 SPI와 ETH을 보시면 좀 감이 오실겁니다. 근데 제 강의에서 ETH는 UDP 에코 서버로 동작하는거라서 구현하시려는 내용이랑은 좀 다를 순 있습니다. 에코가 아닌 칩에서 받은 데이터를 보내셔야 겠지요.
      그리고 ADS1278에서 ADC를 해주니깐 STM32 자체 ADC는 사용하지 않아도 될 것 같은데, 시스템 구성을 어떻게 하시려는지 개념을 좀 잡아보셔야 할 것 같습니다 ㅎㅎ

    • @peacem5153
      @peacem5153 4 ปีที่แล้ว

      @@ChrisWonyeobPark 네.. ADS1278과 STM칩 연결을 SPI DMA를 통해 하는데.. 내부 ADC 사용해서 DMA 연결하는 7강 강의와는 다르게 어떻게 해야할지 모르겠네요...ㅠㅠ
      7강보니 HAL_ADC_Start_DMA 함수호출해서 하던데.. 저같은 경우는 어떤 함수 호출을 해야할까요?? 아니면, 참고할만한 게 있으면 알려주시면 감사하겠습니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  4 ปีที่แล้ว

      @@peacem5153 아 그럼 ADC 기능은 사용하지 않겠군요. SPI 통신으로 우선 데이터가 잘 받아지는지부터 확인해본 후에 DMA를 같이 사용하는 방법으로 진행하시면 될 것 같습니다.
      데이터가 잘 받아지는지 확인해보는게 우선입니다.

  • @yong-b3y
    @yong-b3y 5 ปีที่แล้ว

    1. 마스터에서 3개의 슬레이브의 데이터 값을 동시에 받고 싶을때는 어떤 통신방법이 적합한가요?
    2. SPI 통신으로 여러 슬레이브를 아주 짧은 시간으로 순차적으로 데이터를 받아야 하나요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      1. 슬레이브 장치가 어떤 인터페이스를 지원하느냐에 따라 그에 맞는 통신을 사용하셔야 합니다. 1:N 통신으로 흔히 사용하는 방식은 I2C, SPI, CAN 등이 있습니다. (CAN은 N:N 가능)
      2. 네. SPI로 1:N 통신을 하신다면 통신할 대상 장치를 CS 핀으로 선택해서 순차적으로 통신하시면 됩니다.

  • @muralkong
    @muralkong 5 ปีที่แล้ว

    안녕하세요! 디버그를 진행하니 아래의 에러메시지가 발생하고 있습니다.
    ....\Src/VS1003.c:125: undefined reference to `_Error_Handler'
    실제 코드를 추적해보니 VS1003.h의 두 함수에서 사용을 하고 있는 것 같습니다.
    첫번째 입니다.
    static void VS1003_SPI_SetSpeed(uint8_t SpeedSet)
    {
    hspi2.Instance = SPI2;
    hspi2.Init.Mode = SPI_MODE_MASTER;
    hspi2.Init.Direction = SPI_DIRECTION_2LINES;
    hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
    hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
    hspi2.Init.NSS = SPI_NSS_SOFT;
    hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi2.Init.CRCPolynomial = 0;
    if(SpeedSet == SPI_SPEED_LOW)
    {
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
    }
    else
    {
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
    }
    if (HAL_SPI_Init(&hspi2) != HAL_OK)
    {
    _Error_Handler(__FILE__, __LINE__);
    }
    }
    두번째 입니다.
    void VS1003_SPI_Init(void)
    {
    /* SPI2 clock enable */
    __HAL_RCC_SPI2_CLK_ENABLE();
    hspi2.Instance = SPI2;
    hspi2.Init.Mode = SPI_MODE_MASTER;
    hspi2.Init.Direction = SPI_DIRECTION_2LINES;
    hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
    hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
    hspi2.Init.NSS = SPI_NSS_SOFT;
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
    hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi2.Init.CRCPolynomial = 0;
    if (HAL_SPI_Init(&hspi2) != HAL_OK)
    {
    _Error_Handler(__FILE__, __LINE__);
    }
    }
    이럴경우 어떻게 처리를 하는가요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว +1

      안녕하세요! 혹시 TrueSTUDIO를 쓰고 계신지요? 위의 _Error_Handler()는 TrueSTUDIO에서 사용되는 에러처리 코드인것응로 보입니다. 위의 에러만 뜬다면 _Error_Handler(__FILE__, __LINE__); 이 코드만 주석으로 막고 한번 실행해보세요!

    • @muralkong
      @muralkong 5 ปีที่แล้ว

      @@ChrisWonyeobPark 예.. 잘 동작을 합니다. ^^

    • @muralkong
      @muralkong 5 ปีที่แล้ว +1

      @@ChrisWonyeobPark 강의 재미있네요. ^^

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      @@muralkong 잘 동작한다니 다행입니다 ㅎㅎ 진행하시다가 막히시면 언제든 또 질문주세요! :)

  • @hongsikyim5704
    @hongsikyim5704 5 ปีที่แล้ว

    안녕하세요. SPI MOSI를 인터럽트로 받으려고 합니다. HAL_SPI_RxCpltCallback 함수를 쓰고, HAL_SPI_Receive_IT로 값을 받으려 했는데, 한 번만 받아지는군요. 해결 방법을 아시나요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว +1

      안녕하세요! 전 SPI 인터럽트를 사용하지 않아서 한번 확인을 좀 해봐야할 것 같습니다. 아마도 UART 수신인터럽트처럼 수신되면 그때마다 인터럽트를 Enable 해줘야하지 않을까 싶습니다. 아니면 CS핀을 Low로 수시로 바꿔주던지 해야할 것 같습니다.
      제 추측엔 SPI는 CS를 하드웨어 컨트롤로 동작시켜야 할 것 같네요. 지금 제 실습보드에서는 소프트웨어 컨트롤로 동작하게 되어있습니다. 하드웨어 컨트롤로 사용하려면 SPI_NSS인가 정해져있는 핀만 CS 기능으로 사용할 수 있습니다.

  • @kkh8623
    @kkh8623 5 ปีที่แล้ว

    안녕하세요. 질문이 있습니다. CubeMX 설정에서 Data size를 정하는것이 어떤 의미가 있는건가요? HAL_SPI_Receive 함수를 보면 거기서도 데이터의 사이즈를 정하게 되어 있어서요.

    • @kkh8623
      @kkh8623 5 ปีที่แล้ว

      32비트의 데이터를 슬레이브로부터 전송받고 싶은데, 그렇게되면 HAL_SPI_Receive의 매개변수를 어떻게 설정해야 할지 궁금합니다.

    • @kkh8623
      @kkh8623 5 ปีที่แล้ว

      그리고 HAL_SPI_Receive의 Size 매개변수의 자료형이 uint16_t인데 그렇다면 2바이트 아닌가요? 영상에선 1바이트로 말씀하셔서.. 제가 잘못알고 있는 건지 궁금합니다.

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว

      데이터 사이즈는 받아올 데이터의 바이트 크기라고 생각하시면 됩니다. 그래서 그 크기만큼의 배열 변수를 전달해줘야 합니다!

    • @kkh8623
      @kkh8623 5 ปีที่แล้ว

      만약 큐브에서 데이터 사이즈를 16비트로 했다면, 리시브 함수의 매개변수 Size의 단위가 2바이트가 되는 것인가요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  5 ปีที่แล้ว +1

      @@kkh8623 네 맞습니다. 영상에서는 데이터 길이를 8비트로 해서 통신 단위가 1바이트가 되지만 CubeMX에서 16비트로 설정하신다면 통신단위가 16비트가 됩니다. 그래도 매개변수는 바이트 단위일거라서 2(16비트)로 적으셔야 할겁니다.
      32비트를 받아오시려면 CubeMX에서 데이터길이를 몇으로 설정하시던지 매개변수는 4로 적으셔야 할 듯합니다.

  • @josephahn2624
    @josephahn2624 6 ปีที่แล้ว

    강의 감사합니다.
    혹시 실례가 안된다면 사용하신 c파일과 h파일 제공받을 수 있을까요?

    • @ChrisWonyeobPark
      @ChrisWonyeobPark  6 ปีที่แล้ว

      안녕하세요! 질문하신 소스코드는 죄송하지만 실습보드 구매하신 분에 한해 제공해드리고 있습니다. 죄송합니다!