STM32G031K LL 라이브러리 사용 - IIC
참고: 이전 항목은 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (11) I2C를 사용해 보자 4 Si7020+ssd1306편STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (10) I2C를 사용해 보자 3 ssd1306편의 계속입니다. Nucleo 보드와 Si7020, SSD1306을 연결합니다. 이번에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.