这个是我的电路图文件:
我的程序:
#define I2C_ADDR 0x11
#define I2C2_SLAVE_ADDRESS7 0x08
/* Private variables ---------------------------------------------------------*/
uint8_t I2C2_Buf_Write[5];
uint8_t I2C2_Buf_Read[2];
uint8_t addr[2];
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void I2C_GPIO_Configuration(void);
void I2C_Configuration(void);
/* Private function ---------------------------------------------------------*/
/**
* @brief Main program
* @param None
* @retval None
*/
void RCC_Configuration(void)
{
// Set_SysClockTo56();
/* Enable HSI CLK = 8M*/
RCC_HSI_Enable(ENABLE);//
/* GPIOA, GPIOB, GPIOC and GPIOF clocks enable */
RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOA |
RCC_AHBPERIPH_GPIOB |
RCC_AHBPERIPH_GPIOC |
RCC_AHBPERIPH_GPIOF, ENABLE);
}
/**
* @brief Configure the LED GPIO ports.
* @param None
* @retval None
*/
/**
* @brief Cofigure the GPIO Ports.
* @param None
* @retval None
*/
void I2C_GPIO_Configuration(void)
{
GPIO_InitPara GPIO_InitStructure;
/* I2C1 and I2C2 GPIO ports */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
/**
* @brief Cofigure the I2C1
* @param None
* @retval None
*/
void I2C_Configuration(void)
{
/* I2C2 periphral configuration */
I2C_InitPara I2C_InitStructure;
I2C_InitStructure.I2C_Protocol = I2C_PROTOCOL_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DUTYCYCLE_2;
I2C_InitStructure.I2C_BitRate = 100000;
I2C_InitStructure.I2C_AddressingMode = I2C_ADDRESSING_MODE_7BIT;
I2C_InitStructure.I2C_DeviceAddress = I2C2_SLAVE_ADDRESS7;
}
int main(void)
{
int i;
//uint32_t sr2_1;
RCC_Configuration();
RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_I2C2RST, ENABLE);
RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_I2C2RST, DISABLE);
I2C_GPIO_Configuration();
I2C_Configuration();
/* Enable I2C2 */
I2C_Enable(I2C2,ENABLE);
I2C_Acknowledge_Enable(I2C2,ENABLE);
/* The software must wait until I2C Bus is idle */
while(I2C_GetBitState(I2C2,I2C_FLAG_I2CBSY));
/* Send a start condition to I2C bus */
I2C_StartOnBus_Enable(I2C2,ENABLE);
/* The software must wait until SBSEND bit is set */
while(!I2C_StateDetect(I2C2,I2C_PROGRAMMINGMODE_MASTER_SBSEND));
/* Send slave address to I2C bus */
I2C_AddressingDevice_7bit(I2C2,I2C_ADDR,I2C_DIRECTION_TRANSMITTER);
//for(;;)
//{
//I2C_SendData(I2C2,I2C2_Buf_Write[0]);
//}
/* The software must wait until ADDSEND bit is set */
while(!I2C_StateDetect(I2C2,I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND));
/* Wait until the transmit data buffer is empty */
while(!I2C_GetBitState(I2C2,I2C_FLAG_TBE));
for(i=0;i<5;i++)
{
/* Data transmission */
I2C_SendData(I2C2,I2C2_Buf_Write[i]);
while(!I2C_StateDetect(I2C2, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED));
}
/* Send a stop condition to I2C bus */
I2C_StopOnBus_Enable(I2C2,ENABLE);
while(I2C2->CTLR1&0x0200);
/*read*/
I2C_Enable(I2C2,ENABLE);
I2C_Acknowledge_Enable(I2C2,ENABLE);
while(I2C_GetBitState(I2C2, I2C_FLAG_I2CBSY));
I2C_StartOnBus_Enable(I2C2, ENABLE);
while(!I2C_StateDetect(I2C2, I2C_PROGRAMMINGMODE_MASTER_SBSEND));
I2C_AddressingDevice_7bit(I2C2,I2C_ADDR,I2C_DIRECTION_TRANSMITTER);
while(!I2C_StateDetect(I2C2, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND));
I2C_StartOnBus_Enable(I2C2, ENABLE);
while(!I2C_StateDetect(I2C2, I2C_PROGRAMMINGMODE_MASTER_SBSEND));
for(i=0;i<2;i++)
{
I2C_SendData(I2C2,addr[i]);
while(!I2C_StateDetect(I2C2, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED));
}
I2C_AddressingDevice_7bit(I2C2, I2C_ADDR, I2C_DIRECTION_RECEIVER);
while(!I2C_StateDetect(I2C2, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND));
for(i=0;i<3;i++)
{
if(i==2)
{
/* Wait until the second last data byte is received into the shift register */
while(!I2C_GetBitState(I2C2,I2C_FLAG_BTC));
/* Send a NACK for the last data byte */
I2C_Acknowledge_Enable(I2C2, DISABLE);
}
/* Wait until the RBNE bit is set */
while(!I2C_StateDetect(I2C2, I2C_PROGRAMMINGMODE_MASTER_BYTE_RECEIVED));
/* Read a data from I2C_DTR */
I2C2_Buf_Read[i] = I2C_ReceiveData(I2C2);
}
I2C_StopOnBus_Enable(I2C2,ENABLE);
while(I2C2->CTLR1&0x0200);
I2C_Acknowledge_Enable(I2C2, ENABLE);
/* Infinite loop */
while(1);
}