库函数:I2C_ Send7bitAddress,STM32作为主器件向从器件发送地址数据,可是他只有7位。而我用的外设模块是8位的,那么我的模块不就不好用了吗?
模块的高两位产生三种指令
B7位 丨 B6位 丨 指令
0 丨 1 丨 数据命令设置
1 丨 0 丨 显示控制命令设置 **每种指令的后六位对应不通的功能**
1 丨 1 丨 地址命令设置
另外有看到:1、I2C_ SendData通过外设I2C模块发送数据:
对应I2C_DR寄存器,DR[7:0]:8位数据寄存器 (8-bit data register)位[7:0];功能:(用于存放接收到的数据或)放置用于发送到总线的数据。
2、 I2C_ Send7bitAddress:发送的模式
是把地址 I2C_Addr & 0xfffe 的值送到DR里面
假设我 I2C_Addr=0x40 那么I2C_Addr & 0xfffe = 0x40 —>DR 推论:其实发送的地址还是8位的。
****问题,如果是这样为什么还要用 I2C_ Send7bitAddress 函数呢,而不直接用 I2C_ SendData。
下面是一段代码,标注了位置①和位置②
[mw_shl_code=c,true]uint8_t I2C_WriteOneByte(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t value)
{
I2C_GenerateSTART(I2Cx, ENABLE); //产生起始信号
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
//判断相应的事件有没有产生
#ifdef AT24C01A
I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);
//↑↑ 传送一个地址字节数据
// **位置①**
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2Cx, addr);
// **位置②**
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
#else [/mw_shl_code]
这两个位置 不应该应该是收到应答信号,然后ADDR位被置1,接受完成接下来才是判断相应的事件才能 “ture” 吗?
希望高手指点,谢谢!
|