void Read_Reg(u8 *DataBuff,u8 ByteQuantity,uint16_t RegAddress,u8 SlaveAddress)
{

 //这句去掉也正常
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008

/* Send START condition */     
 I2C_GenerateSTART(I2C1, ENABLE);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 /* 发送器件地址(写)*/
 I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Transmitter);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); /* EV7 */

 //这句去掉也正常
 /* Clear EV6 by setting again the PE bit */
 I2C_Cmd(I2C1, ENABLE);

I2C_SendData(I2C1,01);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,RegAddress>>8);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,RegAddress);
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, SlaveAddress, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); /* EV7 */

while (ByteQuantity)
{
    if(ByteQuantity==1)
    {
         I2C_AcknowledgeConfig(I2C1, DISABLE);    //最后一位后要关闭应答的
        I2C_GenerateSTOP(I2C1, ENABLE);            //发送停止位
    }
    
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */
    *DataBuff = I2C_ReceiveData(I2C1);
    DataBuff++;
    /* Decrement the read bytes counter */
    ByteQuantity--;
}
//再次允许应答模式
I2C_AcknowledgeConfig(I2C1, ENABLE);
//errorflag=0;
//break;

}

void Write_Reg(uint16_t WriteValue,uint16_t RegAddress,u8 SlaveAddress)
{

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008

/ Send START condition /
I2C_GenerateSTART(I2C1, ENABLE);

/ Test on EV5 and clear it /
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

/ Send EEPROM address for write /
I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Transmitter);

/ Test on EV6 and clear it /
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  I2C_SendData(I2C1,0x81);

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(I2C1,RegAddress>>8);

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(I2C1,RegAddress);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(I2C1,WriteValue>>8);

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(I2C1,WriteValue);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/ Send STOP condition /
I2C_GenerateSTOP(I2C1, ENABLE);
}

/**

  • @brief Transmits the address byte to select the slave device.
  • @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
  • @param Address: specifies the slave address which will be transmitted
  • @param I2C_Direction: specifies whether the I2C device will be a
  • Transmitter or a Receiver. This parameter can be one of the following values
  • @arg I2C_Direction_Transmitter: Transmitter mode
  • @arg I2C_Direction_Receiver: Receiver mode
  • @retval None.
    */

void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction)
{
/ Check the parameters /
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_DIRECTION(I2C_Direction));
/ Test on the direction to set/reset the read/write bit /
if (I2C_Direction != I2C_Direction_Transmitter)
{

/* Set the address bit0 for read */
Address |= OAR1_ADD0_Set;

}
else
{

/* Reset the address bit0 for write */
Address &= OAR1_ADD0_Reset;

}
/ Send the address /
I2Cx->DR = Address;
}

define I2C_Direction_Transmitter ((uint8_t)0x00)

define I2C_Direction_Receiver ((uint8_t)0x01)

7位模式下,地址字节最低位若是0则说明主机要进入发送模式,若是1则是接收模式

标签: none

评论已关闭