打印
[应用相关]

stm32 IIC从机模式(7bit&10bit地址模式)

[复制链接]
593|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言

在使用 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

使用特权

评论回复
沙发
IntelCore| | 2025-1-20 17:17 | 只看该作者
有什么传感器是10位的吗?目前没遇到过。

使用特权

评论回复
板凳
Amazingxixixi| | 2025-1-21 16:57 | 只看该作者
学习一下啊,还有好多需要学习的。

使用特权

评论回复
地板
gejigeji521| | 2025-1-21 18:03 | 只看该作者
这种更加适合模拟的I2C,才需要更了解时许。

使用特权

评论回复
5
SophiaOP| | 2025-1-22 21:10 | 只看该作者
十位可以放更多从机

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

4190

帖子

5

粉丝