前言
在使用 STM32 的 I2C 外设时,除了常用的 7 位地址模式,I2C 还支持扩展的 10 位地址模式,用于连接更多从机设备。本文详细记录了学习过程、问题分析和最终的解决方法,希望对需要使用 stm32 IIC从机模式模式的开发者有所帮助。7位地址比较常用,本文着重于10位地址模式。
1、10位地址模式概述
在 10 位地址模式下,主机通信需要发送两帧地址:
第一帧:
高 7 位:11110XXX(前5位固定,6,7位为从机地址高 2 位)。
第 8 位:R/W 位,表示读或写操作。
第二帧:从机地址低 8 位
2、硬件电路实现
主要用到stm32中的PB6和PB7硬件IIC资源
3、代码实现
主要的配置代码如下:
#define I2C_OWN_ADDRESS10 (0x3ff )
/*I2C½Ó¿Ú*/
#define AS_SLAVE_I2C I2C1
#define AS_SLAVE_I2C_CLK RCC_APB1Periph_I2C1
#define AS_SLAVE_I2C_CLK_INIT RCC_APB1PeriphClockCmd
#define AS_SLAVE_I2C_SCL_PIN GPIO_Pin_6
#define AS_SLAVE_I2C_SCL_GPIO_PORT GPIOB
#define AS_SLAVE_I2C_SCL_GPIO_CLK RCC_AHB1Periph_GPIOB
#define AS_SLAVE_I2C_SCL_SOURCE GPIO_PinSource6
#define AS_SLAVE_I2C_SCL_AF GPIO_AF_I2C1
#define AS_SLAVE_I2C_SDA_PIN GPIO_Pin_7
#define AS_SLAVE_I2C_SDA_GPIO_PORT GPIOB
#define AS_SLAVE_I2C_SDA_GPIO_CLK RCC_AHB1Periph_GPIOB
#define AS_SLAVE_I2C_SDA_SOURCE GPIO_PinSource7
#define AS_SLAVE_I2C_SDA_AF GPIO_AF_I2C1
static void iic_config()
{
I2C_InitTypeDef I2C_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_10bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_OwnAddress1 = I2C_OWN_ADDRESS10;
I2C_Init(AS_SLAVE_I2C,&I2C_InitStructure);
I2C_Cmd(AS_SLAVE_I2C, ENABLE); /* ʹÄÜ I2C1 */
I2C_AcknowledgeConfig(AS_SLAVE_I2C, ENABLE);
/* Configure the I2C event priority */
NVIC_InitStructure.NVIC_IRQChannel = AS_SLAVE_IIC_EV_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Configure I2C error interrupt to have the higher priority */
NVIC_InitStructure.NVIC_IRQChannel = AS_SLAVE_IIC_ER_IRQn;
NVIC_Init(&NVIC_InitStructure);
/* Apply I2C configuration after enabling it */
I2C_Init(AS_SLAVE_I2C, &I2C_InitStructure);
I2C_ITConfig(AS_SLAVE_I2C, I2C_IT_EVT, ENABLE); //Part of the STM32 I2C driver
I2C_ITConfig(AS_SLAVE_I2C, I2C_IT_BUF, ENABLE);
I2C_ITConfig(AS_SLAVE_I2C, I2C_IT_ERR, ENABLE); //Part of the STM32 I2C driver
}
其中以下两句代码是配置成10bit模式的关键
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_10bit;
I2C_InitStructure.I2C_OwnAddress1 = I2C_OWN_ADDRESS10;
如果要配置成7bit模式的话,只要更改上述两句语句的配置即可
ISR里面处理的话遵循官方的手册内容:
结果验证:
通过自己编写的IIC上位机去验证,HOST发数据,通过串口将IIC接收到的数据打印出来,结果如下图:
我的代码里设置的从机10bit地址位0x3ff ,所以host在发地址的时候会发两byte地址数据,分别是0xf6和0xff。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xiaohuaruwo/article/details/145083187
|