为什么I2C从机地址要左移一位

    对许多刚开始接触I2C的新手来说,最开始比较疑惑,当MCU做主机与一些I2C接口的从机(比如一些数字传感器,大多数仍为I2C接口)通信时,无论是用IO模拟I2C协议还是使用I2C模块,在发送从机地址时为什么都需要将从机手册的I2C地址左移一位发出去呢?当然这个问题是比较初级的了,高手直接略过,新手权且简单看一看作为学习资料吧。

    首先以飞思卡尔Kinetis系列为例(咳咳,好多人估计都快吐了,肿么又是Kinetis,俺也木有办法,谁让俺天天就接触这个了,呵呵),我们先看看I2C模块的地址寄存器如下图,这个比较直接明了,即本身地址寄存器就是高八位有效的,所以我们在写入从机地址时肯定需要左移一位再写进去,但是又有人要问了,为啥做成左对齐的格式呢(俺们都是习惯了右对齐啊),咳咳,那我们只能忍一忍继续往下看。

image

    好了,首先恭喜你坚持下来继续往下看,呵呵,先上图,该图为I2C的时序图,这个图更为直接的解释了左对齐地址及左移一位的原因,首先I2C的从机地址时MSB先发送的,所以需要左对齐,其次I2C时序中第8位即LSB使其R/W即读写控制位,这下又明了了吧,这也就是为什么我们在读写I2C从机时都会左移一位然后或上一个读写位了,如果不左移,后果你们都懂的,呵呵。

image

    其实说到这,本篇文章应该就该收尾结束了,但是我想提醒的是,现在包括飞思卡尔官方或者第三方都提供了比较完善的I2C驱动库(或者MQX下的I2C驱动),其驱动里面已经做好了移位及读写控制操作,所以我们在调用函数接口时传递I2C从机地址时只需要把从机手册中的I2C地址直接填进去即可,我们不需要自己先左移好地址在传递过去,这样的话传的地址就不对了。之所以最后提醒一句就是之前的确有用户遇到这样的问题了,最后花了很长时间才发现是自己预移一位造成从机地址错误了

在使用STM32单片机之间的I2C总线通信时,每个设备需要设置唯一的地址,以便在总线上进行识别和通信。以下是设置I2C设备地址的示例代码: ```c #include "stm32f1xx_hal.h" /* 定义I2C设备地址 */ #define DEVICE_ADDRESS 0x50 I2C_HandleTypeDef hi2c1; /* I2C初始化代码 */ void MX_I2C1_Init(void) { /* I2C时钟使能 */ __HAL_RCC_I2C1_CLK_ENABLE(); /* I2C GPIO初始化 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* I2C初始化 */ hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = DEVICE_ADDRESS << 1; // 设置I2C设备地址 hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0xFF; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; /* I2C使能 */ if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } ``` 以上代码演示了如何使用STM32F1xx_HAL库初始化I2C1总线,以及如何设置I2C设备地址。将DEVICE_ADDRESS设置为一个唯一的值即可。在这个示例中,设备地址为0x50。 注意,在STM32F1xx系列中,I2C设备地址是7位的,所以需要左移一位将8位地址转换为7位地址。在其他系列的STM32单片机上,I2C设备地址可能是不同的,具体设置方式可能有所不同。需要根据具体的芯片手册进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值