本帖最后由 jianhanpiaoying 于 2018-6-3 18:37 编辑
1. 对于硬件IIC的初始化流程包括 1. 配置IO口,配置为GPIO_Mode_AF_OD模式 2. 选择IIC模式 3. 选择是否使能自动应答以及设备地址长度 4. 设置IIC总线的传输速率 2. 硬件IIC的读写操作其实逻辑上和标准总线类似,也是发送地址等待ack发送数据等待ACK,但是因为有硬件的自动参与,所以我们不需要延时了 具体代码如下 [cpp] view plain copy
- void HmcIICInit(void)
- {
- /*GPIO初始化*/
- GPIO_InitTypeDef GPIO_InitStructure;
- /* 配置硬件IIC需要的变量 */
- I2C_InitTypeDef I2C_InitStructure;
-
- /* 使能与 I2C1 有关的时钟 */
- RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE );
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
-
- /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- /*IIC外设初始化*/
-
- /* I2C 配置 */
- I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; //配置为普通IIC模式
- //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
- //I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress;
- I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能自动应答
- I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
- I2C_InitStructure.I2C_ClockSpeed = 50000; //5K的速度?
-
-
- /* I2C1 初始化 */
- I2C_Init(I2C1, &I2C_InitStructure);
-
- /* 使能 I2C1 */
- I2C_Cmd (I2C1,ENABLE);
- /*允许应答模式*/
- I2C_AcknowledgeConfig(I2C1, ENABLE);
- }
-
- void HmcByteWrite(u8 addr,u8 dataValue)
- {
- I2C_GenerateSTART(I2C1,ENABLE);
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
-
- I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
-
- I2C_SendData(I2C1,addr);
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
-
- I2C_SendData(I2C1,dataValue);
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
-
- I2C_GenerateSTOP(I2C1,ENABLE);
-
- }
-
- u8 HmcByteRead(u8 addr)
- {
- u8 dataValue;
-
- while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
-
- I2C_GenerateSTART(I2C1,ENABLE);//起始信号
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
-
- I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);//发送设备地址+写信号
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//
-
- I2C_Cmd(I2C1,ENABLE);
-
- I2C_SendData(I2C1,addr);//发送存储单元地址,从0开始
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
-
- I2C_GenerateSTART(I2C1,ENABLE);//起始信号
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
-
- I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Receiver);//发送设备地址+读信号
-
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
-
- I2C_AcknowledgeConfig(I2C1,DISABLE);
-
- I2C_GenerateSTOP(I2C1,ENABLE);
-
- while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));
-
- dataValue=I2C_ReceiveData(I2C1);//读出寄存器数据
-
- return dataValue;
- }
转自:https://blog.csdn.net/Luckylyq411/article/details/53102494
|