STM32G031K LL 라이브러리 사용 - IIC

설명: 드라이버는 STm32G031K6를 기반으로 하며, 기타 모델은 자체적으로 변경해야 합니다.
참고: 이전 항목은 LL 라이브러리의 IIC를 사용하지 않았기 때문에 이 드라이브는 실제 검증을 거치지 않았습니다.사용 중인 질문을 피드백하는 것을 환영합니다.
IIC 초기화: CubeMX 생성
void STM32LLI2C1_Init(void)
{
  LL_I2C_InitTypeDef I2C_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  /**I2C1 GPIO Configuration  
  PA9   ------> I2C1_SCL
  PA10   ------> I2C1_SDA 
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_9|LL_GPIO_PIN_10;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1);

  /** I2C Initialization 
  */
  I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;
  I2C_InitStruct.Timing = 0x00303D5B;
  I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE;
  I2C_InitStruct.DigitalFilter = 0;
  I2C_InitStruct.OwnAddress1 = 0;
  I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;
  I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;
  LL_I2C_Init(I2C1, &I2C_InitStruct);
  LL_I2C_EnableAutoEndMode(I2C1);
  LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK);
  LL_I2C_DisableOwnAddress2(I2C1);
  LL_I2C_DisableGeneralCall(I2C1);
  LL_I2C_EnableClockStretching(I2C1);
  LL_I2C_Enable(I2C1);
}

LL 라이브러리는 HAL과 유사한 I2C 멀티데이터 읽기 함수 인터페이스를 제공하지 않기 때문에 스스로 함수를 작성해야 합니다. 저는 HAL 라이브러리 내의 HAL 을 참조합니다.I2C_Mem_Write 및 HALI2C_Mem_Read 쓰기 LL 라이브러리에서 사용할 수 있는 대응 함수입니다.
I2C는 여러 데이터를 읽습니다.
void STM32I2C1_MasterRead(uint8_t device_7BitAddr, uint16_t mem_address,uint16_t mem_size,uint8_t *pdata,uint8_t length)
{
    //  iic  
    while(LL_I2C_IsActiveFlag_BUSY(I2C1));
    //  iic    
    if(!LL_I2C_IsEnabled(I2C1))
    {
        LL_I2C_Enable(I2C1);
    }
    //  
    LL_I2C_HandleTransfer(I2C1,device_7BitAddr,LL_I2C_ADDRSLAVE_7BIT,mem_size,I2C_SOFTEND_MODE,I2C_GENERATE_START_WRITE);
    while(!LL_I2C_IsActiveFlag_TXIS(I2C1));

    //          
    ucBSP_I2C1_WriteMemAddr(mem_address,mem_size);
    while(!LL_I2C_IsActiveFlag_TC(I2C1));

    //  
    LL_I2C_HandleTransfer(I2C1,device_7BitAddr,LL_I2C_ADDRSLAVE_7BIT,length,I2C_AUTOEND_MODE,I2C_GENERATE_START_READ);

    //    
    ucBSP_I2C1_ReadMultipleData(pdata,length);

    //      
    while(!LL_I2C_IsActiveFlag_STOP(I2C1));
    LL_I2C_ClearFlag_STOP(I2C1);
}

I2C는 여러 데이터를 씁니다.
void STM32I2C1_MasterWrite(uint8_t device_7BitAddr, uint16_t mem_address,uint16_t mem_size,uint8_t *pdata,uint8_t length)
{
    //  iic  
    while(LL_I2C_IsActiveFlag_BUSY(I2C1));
    //  iic    
    if(!LL_I2C_IsEnabled(I2C1))
    {
        LL_I2C_Enable(I2C1);
    }
    //    
    LL_I2C_HandleTransfer(I2C1,device_7BitAddr,LL_I2C_ADDRSLAVE_7BIT,mem_size,I2C_RELOAD_MODE,I2C_GENERATE_START_WRITE);
    while(!LL_I2C_IsActiveFlag_TXIS(I2C1));
    
    //          
    ucBSP_I2C1_WriteMemAddr(mem_address,mem_size);
    while(!LL_I2C_IsActiveFlag_TCR(I2C1));

    //           
    LL_I2C_HandleTransfer(I2C1,device_7BitAddr,LL_I2C_ADDRSLAVE_7BIT,length,I2C_AUTOEND_MODE,I2C_NO_STARTSTOP);

    //   
    ucBSP_I2C1_WriteMultipleData(pdata,length);

    //      
    while(!LL_I2C_IsActiveFlag_STOP(I2C1));
    LL_I2C_ClearFlag_STOP(I2C1);
}

코드의 중복을 줄이고 읽기 가능성을 높이기 위해 읽기와 쓰기의 일부 과정에 대해 함수를 따로 만들었다.
쓰기 레지스터 주소:
void STM32I2C1_WriteMemAddr(uint16_t mem_address,uint16_t mem_size)
{
    uint8_t MemAddrLSB = I2C_MEM_ADD_LSB(mem_address);;
    uint8_t MemAddrMSB = I2C_MEM_ADD_MSB(mem_address);;

    //         
    if(mem_size == I2C_MEMADD_SIZE_8BIT)
    {
        LL_I2C_TransmitData8(I2C1, MemAddrLSB);
    }else{
        LL_I2C_TransmitData8(I2C1, MemAddrMSB);
        //      
        while(!LL_I2C_IsActiveFlag_TXIS(I2C1));
        LL_I2C_TransmitData8(I2C1, MemAddrLSB);
    }
}

255 개 미만의 데이터를 순차적으로 쓰기:
void STM32I2C1_WriteMultipleData(uint8_t *pdata,uint8_t length)
{
    uint8_t count;
    for(count=0;count

연속 읽기 255 개 미만:
void STM32I2C1_ReadMultipleData(uint8_t *pdata,uint8_t length)
{
    uint8_t count;
    for(count=0;count

좋은 웹페이지 즐겨찾기