Hii Chris Thanks for education videos. I have a question! why did you use for loop and eeprom[0]=0x00; ?? İf I dont use can I read correctly the data with the read function? OR We reset the eeprom array to 0 to read correctly.
@ChrisWonyeobPark5 жыл бұрын
Hello Hasan. The for loop initializes eeprom[] array to 0. You don't need to use for loop.Just initialization.
@노영철-r3n6 жыл бұрын
유익한 강의 매번 감사드립니다. 위 강의에서는 다루지 않았지만 제가 다루는 GY-86에 구성요소중 하나인 MPU-6050 센서는 레지스터 구성이 Accel_Xout_H, Accel_Xout_L 이런식으로 16비트 데이터를 8비트씩 나누어 저장하게 되어있습니다 다른 주소로요 이런 상황일땐 I2C통신으로 각각의 레지스터마다 데이터를 받는 절차를 수행하여 받은 각각의 8비트 H,L데이터를 16비트로 합쳐주어야 하는건가요? 만약 합쳐야 한다면 어떤식으로 하는게 가장 이상적인 루틴일지 궁금합니다 그리고 사족이지만 I2C관련 HAL라이브러리는 ACK와 P(stop bit) 를 확인하는 함수가 없던데 만약 다른 I2C관련 HAL 라이브러리 내에서 확인을 하는것이라면 따로 확인할수 있는 방법은 STM32내부의 I2C 관련 레지스터에서 ACK와 P 를 받는 레지스터를 어드레스로 직접 접근하여 확인을 해야하는지 궁금합니다.
@ChrisWonyeobPark6 жыл бұрын
네 당연히 8비트씩 두번으로 나눠받는다면 하나로 합쳐주는 작업이 필요하겠죠. ㅎㅎ 보통은 비트시프트해서 or 연산으로 합칩니다. 근데 시프트연산과 or연산시 클럭이 소모되기 때문에 포인터 연산으로 처리해주는게 가장 이상적일거 같긴 합니다. HAL I2C 라이브러리 함수 내에 그 기능들이 들어있습니다. 그래서 우리는 HAL I2C 함수만 사용하면 바로 통신이 되는데,, 한번 해보시면 감이 올거에요 ㅎㅎ
@노영철-r3n6 жыл бұрын
@@ChrisWonyeobPark 8비트 데이터 두개를 받아서 short int 자료형에 포인터 연산으로 집어 넣었더니 데이터값이 제대로 나오네요 ㅎㅎ 비트 시프트만 생각했었는데 포인터 연산이 더 간결하고 쓰기 쉬운거 같습니다 유익한 조언 감사드립니다. 그리고 제가 드론 제어쪽으로 가려다 보니 센서값을 받아오는것과 보정하는 작업을 마치면 센서값을 이용해 PID제어를 할려고 하는데 혹시 폐가 되지 않는다면 종종 질문을 드려도 괜찮을까요? 드론제어 프로그램 영상도 봤는데 너무 잘하셔서 종종 도움을 구하고 싶습니다. 언제나 유익한 강의 감사드립니다.
@HongHong-s2k4 жыл бұрын
허접한 질문이지만 왜 00, 11 이런 숫자를 eeprom에 써줄 때 왜 0x00, 0x11이런식으로 써줘야 하나요? 그냥 eeprom[10] = 00,11,22,33..이런식으로 쓰면 안되나요?
@ChrisWonyeobPark4 жыл бұрын
안녕하세요 ㅎㅎ C언어에서는 숫자 앞에 접두어 0x가 붙으면 16진수를 의미합니다. 또한 앞에 0이 붙으면 8진수를 의미합니다. 따라서 0x11과 11과 011은 다 다른숫자입니다. 자세한건 C언어 문법을 공부하시기 바랍니다!
@muk6502001ify2 жыл бұрын
안녕하세요 영상 잘 보고 있습니다. 질문이 하나 있습니다. 쓰기를 할 때에는 장치 주소를 0xA0으로 했으면 읽기를 할 때에는 장치 수조를 0xA1로 해야 하는 것 아닌가요? 장치주소의 LSB는 수행하는 동작에 따라서 달라져야 한다고 생각하는데... 읽기를 할 때 0xA0로 했는데도 읽어지는걸 보면 동작은 하네요 왜그런지 잘 모르겠습니다.
@ChrisWonyeobPark2 жыл бұрын
안녕하세요! 좋은 질문입니다. 말씀하신게 맞습니다. 다만, 그걸 우리가 직접 코드로 작성해주는 것이 아니고 HAL 드라이버 안에서 처리해줍니다. 보시면 읽기함수와 쓰기함수의 이름이 다르죠. 각각의 함수 정의로 들어가서 보시면 해당하는 내용이 이미 구현되어있습니다. 만약 HAL드라이버를 사용하지 않고 다른 방식(직접작성 또는 LL드라이버 사용 등)으로 통신하려면 말씀하신 코드를 직접 작성하여야 할 수도 있습니다.
@muk6502001ify2 жыл бұрын
@@ChrisWonyeobPark hal의 세계는 대단하네요 감사합니다!!
@김형균-s1t5 жыл бұрын
안녕하세요 궁금한게 있어서 질문 남기겠습니다 제CubeMX프로그램은 configuration 셋팅창에 듀티 사이클 대신 라이즈 타임이랑 폴타임및 디지탈 필터 등 다른 설정이 있어서 듀티 사이클 셋팅방법에 대해 궁금합니다.
안녕하세요 영상 잘 보고 있습니다! 영상보면서 궁금한게 있는데요. I2C 공부하면서 HAL 드라이버 함수를 보니까 HAL_I2C_Master_Transmit / Receive 함수가 있고 HAL_I2C_Mem_Write / Read 함수가 있더라구요. 여기서 궁금한 부분이 위의 함수의 경우 Slave에서 data를 읽어올때 먼저 HAL_I2C_Master_Transmit로 Slave의 MemAddress를 1Byte 보내준 다음에 HAL_I2C_Master_Receive를 써서 slave로부터 data를 읽어 오더라구요. 예를 들면 HAL_I2C_Master_Transmit(&hi2c1, mpu6050Address, 0x1C, 1, 10); HAL_I2C_Master_Receive(&hi2c1, mpu6050Address, &i2cBuf[1], 1, 10); 이렇게 하면 MPU6050의 메모리 주소 0x1C에 있는 data를 보드의 i2cBuf[1]로 가져오는 것 같은데 ... 이런식으로도 가능한 건가여??
@ChrisWonyeobPark4 жыл бұрын
안녕하세요 좋게 봐주셔서 감사합니다 ㅎㅎ 저는 HAL_I2C_Master_Transmit() 이 함수는 사용해보진 않았는데, 말씀하신대로도 동작이 가능할 것 같습니다. I2C로 데이터를 읽어올때의 프로세스가 보통은 말씀하신대로 동작합니다. 위의 코드가 문제없이 잘 동작한다면 그대로 사용하면 될 것 같습니다 ㅎㅎ
@환상-u6i4 жыл бұрын
@@ChrisWonyeobPark 답변 감사합니다 ! 오늘 Test해본 결과 위의 예를 든것 처럼 코드를 작성하면 HAL_I2C_Mem_Receive와 비슷하게 동작이 되더군요. 현재 MPU-6050으로 실습을 하고 있는데 생각보다 따져줘야 할 게 많은것 같아요. 특히 while문 안에서 HAL_I2C_Mem_Receive 함수를 이용하여 가속도 센서 값, 자이로 센서 값 각각 6Byte 씩 읽어오는데 while문 마지막에 HAL_delay를 적당값 넣어주지 않으면 해당 프로그램을 재다운로드 했을때 동작이 아예 멈추더라구요... I2C는 메인보드도 공부를 해야하지만 개별적으로 Slave 모듈의 공부가 더 필요한 것 같은 느낌이네요.
@ChrisWonyeobPark4 жыл бұрын
@@환상-u6i 제 생각엔 HAL_I2C_Mem_Receive () 이 함수에 좀 문제가 있는 것 같습니다. EEPROM에 메모리를 읽고 쓰는 경우에도 HAL_I2C_Mem_Receive/Write() 함수를 쓰는 경우는 약간의 딜레이가 필요한 경우가 있었습니다. 제 추측엔 위의 함수 내부에서 처리되는 뭔가가 시간딜레이가 좀 필요한 것 같습니다. HAL이 아닌 LL을 써서 구현하는 코드에서는 딜레이가 없어도 잘 동작했었거든요. 코드의 내용을 자세히 봐야지 알겠지만, HAL_I2C_Mem_Receive/Write() 함수에 조금 문제가 있다는 생각입니다. 위의 함수 말고 다른 방법으로 구현하는 것도 고려해보세요~
@환상-u6i4 жыл бұрын
@@ChrisWonyeobPark 아 그렇군요. 무작정 함수만 믿고 사용하는 것은 역시 좀 위험하네요. 답변 감사합니다!
@ChrisWonyeobPark4 жыл бұрын
@@환상-u6i 네 한번 LL로 구현된 I2C 통신 함수를 찾아서 사용해보시는것도 좋을 것 같습니다. 구글링 해보시면 금방 찾으실 수 있을거에요~ 그건 딜레이 없어도 잘 동작할겁니다 ㅎㅎ
@도로동-h1y6 жыл бұрын
안녕하세요 열심히 유투부보면서 큐브맥스로 STM32 칩 공부하고 있는 학생입니다. 캐릭터 엘씨디편은 봤는데 이번에 그래픽엘씨디로 뭔가 구현해 보려하는데 뭔가 막혀있네요 ㅠㅠ 혹시 SPI 또는 GLCD관련 강좌는 안올려주시는지 궁금해서 여쭤보려구 댓글남겼어용
@ChrisWonyeobPark6 жыл бұрын
안녕하세요~ TFT-LCD는 드라이버에 따라 SPI 방식과 병렬통신 방식으로 인터페이스 하는데, 바로 다음 영상때 SPI 통신으로 사운드코덱으로 음성 재생하는걸 할 예정입니다. 병렬통신 방식은 본 강의계획에는 없습니다. TFT-LCD 컨트롤러는 STM32F4x9 시리즈에 내장되어있고, (제가 사용하는 407을 포함해서) 그 이하의 칩 시리즈 같은경우엔 FSMC를 사용하여 인터페이스 하는 예제가 있습니다. 감사합니다!
@이동기-r9x6 жыл бұрын
안녕하세요. 가속도 센서를 i2c로 통신해서 데이터를 받아오고싶은데... 어떤식으로 다가가야될까요 ? EEPROM 이랑은 방식이 좀 많이 다를거같은데...
@ChrisWonyeobPark6 жыл бұрын
가장 쉽게 하는 구현하는 방법은 사용하시는 센서의 오픈소스 라이브러리 코드를 다운받아서 해보시는 겁니다. 직접 하나씩 구현해보시려면 데이터시트에 나와있는 I2C 통신 절차를 따라 HAL I2C 함수로 구현하시면 될거구요. 당연히 EEPROM이랑은 다를겁니다. 가속도센서값이 저장된 특정 레지스터 주소에 접근해서 값을 읽어오셔야 하니까 레지스터 맵을 참고하셔야겠죠! 또한 I2C 통신이 어떤방식으로 이뤄지는지에 대해 학습하시면 이해가 더 빠르게 될겁니다~
@꾸욱꾸욱꼬르륵5 жыл бұрын
실습하기 위해 보드 구매 고고고
@ChrisWonyeobPark5 жыл бұрын
안녕하세요! ㅎㅎ 감사합니다! 네이버 회신드렸으니 확인부탁드려요 :)
@josephahn26246 жыл бұрын
안녕하세요. 강의내용과는 조금 동 떨어진 질문이 있습니다. STM32F4 MCU랑 어떤 모듈이랑 I2C 인터페이스를 하려고 하는데 해당 모듈이 MCU와 인터페이스가 가능한지를 판단하려면 어떤 것을 보아야 할까요? MCU의 핀 전압이 모듈의 핀 허용 전압범위 내에 들어오는지를 보면 되나요?
@ChrisWonyeobPark6 жыл бұрын
안녕하세요 ㅎㅎ 먼저 그 모듈이 I2C 통신으로 데이터를 인터페이스 하는지를 보셔야 하구요, 전압은 3.3V나 5V나 둘다 통신 가능하니깐 고려할 필요는 없을것 같습니다. 해당 모듈의 데이터시트를 보시면 I2C인지 뭔지 나와있을겁니다. 한번 확인해보세요~
@영인박-l4i Жыл бұрын
Mem_write 또는 read쓸때 디바이스 주소값 앞으로 밀어주거나 1 더해주거나 해야하지 않나요?
@ChrisWonyeobPark Жыл бұрын
HAL 드라이버를 사용할때는 HAL 드라이버 내부에서 처리 되기 때문에, 사용자가 따로 해주지 않습니다. 만약 따로 해주셨다면 그것 때문에 문제가 되서 통신이 안될수도 있습니다.
음 이부분만 봐서는 뭐가 문제인지 확인하기 어렵겠네요.. I2C_TEST_T 구조체 정의부분이랑 I2C 초기화 부분을 좀 확인해보셔야 할 듯 합니다. 그리고 사용하시는 EEPROM 의 파트넘버도 확인해보셔야 할듯 하구요~ 데이터가 어떻게 이상한지도 알려주시구요~
@하리보-n4h Жыл бұрын
ftp로 파일을 다운로드 받은것을 eeprom 또는 flash memory에 저장하는 방법을 어디서 알수 있을까요?? 해당 파일로 펌웨어의 업데이트를 하려고 합니다
@ChrisWonyeobPark Жыл бұрын
말씀하신 기능이 불가능할 것 같진 않습니다. 다만 구체적이고 특수한 상황의 동작에 대한 강의는 찾기가 어려울 것 같고 ftp따로, eeprom따로, flash 저장 따로 공부하셔서 하나로 합치셔야 할 것 같습니다.
@하리보-n4h Жыл бұрын
@@ChrisWonyeobPark 부트모드 없이도 가능한가요??
@ChrisWonyeobPark Жыл бұрын
@@하리보-n4h 플래시의 펌웨어영역에 데이터를 써야한다면 부트로더를 직접 올리는 것도 필요합니다.
@영인박-l4i Жыл бұрын
write부분과 read하는 부분에서 자꾸 busy값 오류가 뜹니다 혹시 제코드 리뷰 또는 i2c에서 busy가 뜨는겨우는 무엇인가요?(코드는 담당자분과 비슷한 코드입니다 칩은 :ACS37800 전원감시칩입니다)
@ChrisWonyeobPark Жыл бұрын
I2C HAL드라이버 사용 시 busy 가 리턴되는 경우는, 통신 선로에 문제가 있거나, slave 장치에서 응답이 없거나 가 아닐까 하는데요. 우선 선 연결에 문제가 없는지, sda와 scl이 모두 풀업 되어있는지를 확인해보세요. 이게 문제없다면 slave에서 응답이 없어서 그럴 것 같습니다.
@영인박-l4i Жыл бұрын
@@ChrisWonyeobPark 현재 회로상에는 문제가 없고요 slave에서 응답이 없는거 같긴하거든 근데 문제는 그 응답이 없다는게 전원을 인가 안해서 없다는건가요 아니면 전원(3.3V)를 넣었는데 I2C 버스에 너무많은 칩을 달아서 그럴까요?(약 41개 칩 달았습니다)
@ChrisWonyeobPark Жыл бұрын
@@영인박-l4i 전원의 문제인지는 오실로나 멀티미터로 확인하시면 될 것 같고, 버스에 너무 많은 슬레이브가 연결되어있어서 그런건지는 테스트가 필요할 것 같습니다. 다른 40대의 장치와는 통신이 잘 되는데, 하나만 통신이 안된다면 그 문제는 아니겠죠.
@영인박-l4i Жыл бұрын
@@ChrisWonyeobPark 해결했어여 말씀대로 오실로로 확인하니 맞네여 ㅎㅎ 항상 감사합니다
@ChrisWonyeobPark Жыл бұрын
@@영인박-l4i 별로 도움 드린것도 없는데 해결하셨다니 다행입니다. 문제 발견하고 그걸 해결하다보면 어느새 실력이 쑥 향상된 것을 느끼실거에요~ 그럼 앞으로도 화이팅입니다!
@yongbeomkim3941 Жыл бұрын
강사님, EEPROM에 정수가 아닌 실수를 읽고 쓸수 있는 방법이 무엇인지 알려주실 수 있는지요?
@ChrisWonyeobPark Жыл бұрын
안녕하세요. EEPROM에 데이터를 쓰거나 읽을때는 사실 데이터의 타입이랑은 관계가 없습니다. EEPROM 입장에서는 실수 float 형태든 정수 int 형태든 똑같은 4바이트 데이터일 뿐이거든요. 따라서 HAL에서 제공하는 HAL_I2C_Mem_Write() 함수를 그냥 바로 쓰셔도 됩니다. 예를들어, float f = 1.234; 라는 데이터가 있다면 HAL_I2C_Mem_Write(&hi2c1, 0xA0, 0x00, I2C_MEMADD_SIZE_8BIT, &f, 4, 10); 라고 코드를 작성하면 0xA0 장치의 메모리주소 0x00에 f = 1.234라는 4바이트 실수 데이터를 4바이트 쓰는 코드가 되겠죠.
@yongbeomkim3941 Жыл бұрын
감사합니다. 한가지 더 궁금한 점은 쉬프트 연산자를 사용하지 않고, 순수히 포인터 연산만으로 8비트 두개를 16비트로 합칠 수가 있는지요? 그리고, stm32 IDE 환경에서 실수를 사용하기 위한 환경설정을 어떻게 할 수 있는지 혹시 알려주실 수 있는지요?
@ChrisWonyeobPark Жыл бұрын
@@yongbeomkim3941 Q1) 쉬프트 연산자를 사용하지 않고, 순수히 포인터 연산만으로 8비트 두개를 16비트로 합칠 수가 있는지? A1) 네 가능합니다. 하지만 저는 union 을 사용하는 방법을 추천드립니다. union을 사용하면 연산 자체가 필요없기 때문입니다. Q2) stm32 IDE 환경에서 실수를 사용하기 위한 환경설정을 어떻게 할 수 있는지 A2) 기본적으로 별다른 설정 없이 4바이트 float형과 8바이트 double형 변수 사용이 가능합니다. 근데 보통 8바이트 double형 변수까지는 잘 사용하진 않고 대부분 float으로 처리합니다.
@꾸욱꾸욱꼬르륵5 жыл бұрын
십슬 보드 별도 구매 링크에 들어가도 구매 방법을 잘 모르겠네요;; 댓글도 막혀 있고
@ChrisWonyeobPark5 жыл бұрын
안녕하세요 ㅎㅎ 댓글은 카페 가입하셔야 쓰실수 있습니다~ 광고댓글 차단하려고 그렇게 해놨습니다!
@안형구-u8u5 жыл бұрын
I2C Read/Write 함수부분에서 6번째 매개변수가 따라가보면 uint16_t(2byte)?로 선언되어있는데 영상에서는 10바이트라고 표현하혔는데 10*2 면 20바이트아닌가요? 제가 말을 잘못해서 오해하실지도 모르는데 딴지거는게 아니라 정말 이부분이 궁금해서 여쭤봅니다
@ChrisWonyeobPark5 жыл бұрын
안녕하세요! 6번째 매개변수는 "uint16_t Size" 를 말씀하시는거 같은데 여기서 10은 바이트를 의미합니다. 데이터 타입인 uint16_t는 여기선 무관합니다. 읽거나 쓸 데이터의 바이트단위 크기라고 생각하시면 됩니다. 님께서 말씀하신건 5번째 매개변수인 "uint8_t* pData"가 되겠죠. 헷갈려 하시는 내용은 C언어의 포인터 부분을 공부하시면 될 것 같네요!
@안형구-u8u5 жыл бұрын
@@ChrisWonyeobPark 감사합니당
@정명훈-j6k4 жыл бұрын
안녕하세요! 혹시 I2C통신 중에 인터럽트가 발생되면 BUSYflag가 초기화가 안되나요? I2C통신중 갑자기 통신이 끊기고 SDA가 LOW로 떨어지며 HAL_I2C_Master_Transmit 함수가 HAL_BYSY를 리턴 하네요 사용 MCU는 F103C8T6를 사용했습니다..ㅠㅠ
@ChrisWonyeobPark4 жыл бұрын
음 그럼 우선 인터럽트방식 말고 기본 통신함수로 한번 해보시기 바랍니다. 우선 대상 장치와 통신이 잘 되는지부터 확인을 해보신 후에 인터럽트 방식으로 바꾸는게 좋을것 같습니다.
@정명훈-j6k4 жыл бұрын
@@ChrisWonyeobPark 네 I2C는 폴링 방식으로 받아오고 UART나 타이머 같은 기능만 인터럽트를 사용했습니다 인터럽트들을 비활성화하니 잘 받아지네요
@ChrisWonyeobPark4 жыл бұрын
@@정명훈-j6k 아 I2C 통신중에 타이머나 UART 같이 다른 인터럽트가 걸리면 통신이 끊어지는 경우인가봅니다. 코드를 확인할 수가 없어서 원인 파악이 좀 어렵습니다. 혹시 그 인터럽트 함수 안에서 Delay나 처리시간이 오래걸리는 기능이 있으면 그 부분을 주석으로 막고 한번 해보세요.
@정명훈-j6k4 жыл бұрын
@@ChrisWonyeobPark 인터럽트 내부에서는 flag변수만 바꾸고 while문 내에서 flag변수를 체크하는 방식으로 작성했는데 음... 뭐가 문제 일까요 GPS를 UART인터럽트로 받아오는데 그게문제 인걸까요ㅠ
@ChrisWonyeobPark4 жыл бұрын
@@정명훈-j6k 음.. 그렇게 했는데도 문제가 생긴다면,, 죄송하지만 코드를 확인할 수 없어서 문제 파악이 어려울 것 같습니다 ㅜㅜ