首页 > 其他分享 >stm32扫描IIC从机地址(HAL库)

stm32扫描IIC从机地址(HAL库)

时间:2022-10-09 10:23:01浏览次数:44  
标签:CODE HAL Init stm32 从机 USER GPIO I2C3

IIC扫描从机实质是向IIC从设备写0x00,看是否能收到应答信号,收到应答代表该地址有效,如下,使用的是stm32e5wl,系统时钟48MHz,从机地址为7位

void MX_I2C3_Init(void)
{

/* USER CODE BEGIN I2C3_Init 0 */

/* USER CODE END I2C3_Init 0 /
/
USER CODE BEGIN I2C3_Init 1 /
/
USER CODE END I2C3_Init 1 /
hi2c3.Instance = I2C3;
hi2c3.Init.Timing = 0x20303E5D;
hi2c3.Init.OwnAddress1 = 0;
hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c3.Init.OwnAddress2 = 0;
hi2c3.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c3) != HAL_OK)
{
Error_Handler();
}
/
* Configure Analogue filter
/
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
Error_Handler();
}
/
* Configure Digital filter
/
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK)
{
Error_Handler();
}
/
USER CODE BEGIN I2C3_Init 2 /
/
USER CODE END I2C3_Init 2 */

}

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(i2cHandle->Instance==I2C3)
{
/* USER CODE BEGIN I2C3_MspInit 0 */

/* USER CODE END I2C3_MspInit 0 */

/** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C3;
PeriphClkInitStruct.I2c3ClockSelection = RCC_I2C3CLKSOURCE_SYSCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
__HAL_RCC_GPIOC_CLK_ENABLE();
/**I2C3 GPIO Configuration
PC1 ------> I2C3_SDA
PC0 ------> I2C3_SCL
/
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/
I2C3 clock enable /
__HAL_RCC_I2C3_CLK_ENABLE();
/
USER CODE BEGIN I2C3_MspInit 1 */

/* USER CODE END I2C3_MspInit 1 */
}
}

void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{
if(i2cHandle->Instance==I2C3)
{
/* USER CODE BEGIN I2C3_MspDeInit 0 */

/* USER CODE END I2C3_MspDeInit 0 /
/
Peripheral clock disable */
__HAL_RCC_I2C3_CLK_DISABLE();
/**I2C3 GPIO Configuration
PC1 ------> I2C3_SDA
PC0 ------> I2C3_SCL
*/
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1);
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0);

/* USER CODE BEGIN I2C3_MspDeInit 1 */

/* USER CODE END I2C3_MspDeInit 1 */
}
}

/* USER CODE BEGIN 1 /
void MX_I2C3_DeInit(void)
{
if (HAL_I2C_DeInit(&hi2c3) != HAL_OK)
{
Error_Handler();
}
}
int main(void)
{
/
USER CODE BEGIN 1 /
uint8_t err_code = 0;
uint8_t data = 0;
uint8_t u8i = 1;
/
USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals /
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_USART1_UART_Init();
MX_I2C3_Init();
/
USER CODE BEGIN 2 */

/* USER CODE END 2 */

/* Infinite loop /
/
USER CODE BEGIN WHILE /
while (1)
{
/
USER CODE END WHILE */
hal_console_trace_print("start find slave device\r\n");
for(u8i = 1;u8i < 127;u8i++)
{
err_code = HAL_I2C_Master_Transmit(&hi2c3,u8i<<1,(uint8_t )&data,1,200);
if(err_code == 0){
hal_console_trace_print("found slave device address :0x%02x\r\n",u8i);
HAL_Delay(20);
}
else{
//hal_console_trace_print("no found slave device ");
}
HAL_Delay(20);
}
hal_console_trace_print("end find slave device\r\n");
HAL_Delay(2000);
}
/
USER CODE END 3 */
}

标签:CODE,HAL,Init,stm32,从机,USER,GPIO,I2C3
From: https://www.cnblogs.com/A-Water-absorbing-sponge/p/16771145.html

相关文章