cubeMX로 I2C 드라이브 개발

3092 단어 사물인터넷

cubeMX로 I2C 드라이브 개발


일의 원인은 pca9555칩으로 단편기의 IO구를 확장해야 하기 때문이다. pca9555의 관리는 I2C 버스를 통해 하는 관리이다.

주의 사항


참고:
  • 메인 디렉터리에서 하지 말고 cubeMX의 프로젝트를 코드copy와 연결해서 코드를 생성해야 한다.새로 생성된 코드가 이전의 코드를 덮어쓰지 않도록 하세요.

  • 어떻게 기존의 cubeMX 프로젝트에서 I2C 코드를 생성합니까?

  • 원래의 코드 디렉터리를 cubeMX 프로젝트와 단독으로 복사하여 임시 폴더에 넣는다.
  • 해당 버전의 CubeMX를 설치합니다(버전 번호는 *.ioc 프로젝트 파일에서 찾을 수 있습니다).CubeMX의 다운로드 주소:https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html
  • 디렉토리에서 *를 두 번 클릭하여 엽니다.ioc의 프로젝트 파일 - CubeMX로 프로젝트를 열 수 있습니다.
  • PB10을 Pinout 탭에서 I2C2 로 선택SCL(클록) PB11 선택 기능은 I2C2SDA(데이터).
  • configuration 페이지 서명에서 Connectivity - I2C2를 엽니다.
  • I2C Speed Mode Fast mode
  • I2C Speed Frequency(KHz) 100//이 주파수는 pca9555(i2c 부품) 매뉴얼을 조회해서 일반 매뉴얼이feature에 부품의 주파수 범위를 설정해야 한다.
  • Rise Time(ns) 300//이 값을 얻으려면 I2C 부품을 찾아야 합니다
  • Fall Time(ns) 300//이 값을 얻으려면 I2C 부품을 찾아야 합니다
  • 기타 실제 상황에 따라 설치
  • Project - Setting 조정 생성 코드 설정
  • Project — Generate Code
  • 코드 비교 도구인beyondcompare로 새로운 생성 코드와 오래된 코드 디렉터리를 비교하고 새로 생성된 코드를 낡은 코드 디렉터리에 조심스럽게 합친다.케일에서 새로 생산한 서류도 공사에 넣었습니다.
  • 새로 생성된 파일 i2c.c i2c.h ; 그리고 일부 파일의 내용이 바뀌었습니다. 예를 들어 gpio입니다.c main.c도 바뀐 내용을 신중하게 비교해서 합쳐야 한다.

  • 어떻게 I2C의 드라이브를 호출합니까?

  • I2C의 초기화 HALI2C_MspInit(&hi2c2); MX_I2C2_Init();
  • 드라이브의 읽기와 쓰기 함수 호출
  • 쓰다
    HAL_StatusTypeDef I2C_PCA9555_WriteBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
    {
      HAL_StatusTypeDef status = HAL_OK;
    
    	//printf("1write i2c addr %x,reg %x\r
    ",Addr,Reg); Addr = (Addr << 1) | 0; //printf("2write i2c addr %x,reg %x\r
    ",Addr,Reg); status = HAL_I2C_Mem_Write(&hi2c2, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, 1000); if (status != HAL_OK) { printf("\r
    i2c error status:%d\r
    ",status); I2C_PCA9555_Error(); } return status; }

    읽다
    HAL_StatusTypeDef I2C_PCA9555_ReadBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
    {
    	HAL_StatusTypeDef status = HAL_OK;
    	
    	//printf("1read i2c addr %x,reg %x\r
    ",Addr,Reg); Addr = (Addr << 1) | 1; //printf("2read i2c addr %x,reg %x\r
    ",Addr,Reg); status = HAL_I2C_Mem_Read(&hi2c2, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, 1000); if (status != HAL_OK) { printf("i2c status:%d\r
    ",status); I2C_PCA9555_Error(); } return status; }
  • 는 또한 gpio에서 두 개의 gpio에 대한 초기화와 관련된다.
  • 주의사항, 디버깅에 시간이 좀 걸렸기 때문입니다.
  • Addr = (Addr << 1) | 0; 쓰기에 있어서 주소를 왼쪽으로 한 자리, 마지막 자리 0으로 이동해야 합니다.
  • Addr = (Addr << 1) | 1; 읽기에 있어서 주소를 왼쪽으로 한 자리, 마지막 자리로 이동해야 한다.


  • 무파형 문제는 어떻게 해결합니까?


    논리 분석기는 3.3V 설비는 2.8V이기 때문에 압차가 저항을 바꾸어 태웠기 때문에 결과적으로 mcu와 i2c 부품 사이가 통하지 않는다. 이후에 이런 상황에 부딪히면 저항이 태웠는지 측정해야 한다.

    좋은 웹페이지 즐겨찾기