官方有硬件iic例程吗,官网的sdk里i2c好像还是中断触发的。
uint8_t I2CWrite(char* pBuffer)
{
uint16_t I2CTimeout = I2CT_LONG_TIMEOUT;
while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_BUSBSY) == SET)
{
I2CInit();
if ((I2CTimeout--) == 0)
{
return I2C_TIMEOUT_UserCallback(4);
}
}
I2C_DisableInterrupt(I2C1, I2C_INT_EVT);
/* Send START condition */
I2C_EnableGenerateStart(I2C1);
I2CTimeout = I2CT_FLAG_TIMEOUT;
while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) //EV5
{
if ((I2CTimeout--) == 0)
{
return I2C_TIMEOUT_UserCallback(5);
}
}
/* Send address for write */
I2C_Tx7BitAddress(I2C1, 0xB0, I2C_DIRECTION_TX);
I2CTimeout = I2CT_FLAG_TIMEOUT;
while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) //EV6
{
if ((I2CTimeout--) == 0)
{
return I2C_TIMEOUT_UserCallback(6);
}
}
/* While there is data to be written */
while (*pBuffer != '\0')
{
I2CTimeout = I2CT_LONG_TIMEOUT;
/* Send the current byte */
I2C_TxData(I2C1, *pBuffer);
if (*(pBuffer+1)!='\0')
{
while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)) //EV8
{
if ((I2CTimeout--) == 0)
{
return I2C_TIMEOUT_UserCallback(8);
}
}
}
else
{
while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) //EV8-2
{
if ((I2CTimeout--) == 0)
{
return I2C_TIMEOUT_UserCallback(9);
}
}
I2C_EnableGenerateStop(I2C1);
}
/* Point to the next byte to be written */
pBuffer++;
}
I2C_EnableInterrupt(I2C1, I2C_INT_EVT);
return 1;
}
void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction)
{
if(direction != I2C_DIRECTION_TX)
{
i2c->DATA_B.DATA = address | 0x0001;
}
else
{
i2c->DATA_B.DATA = address & 0xFFFE;
}
}