MM32F3273G8P火龙果开发板MindSDK开发教程9 -i2c阻塞方式的使用
1、I2c的初始化
使用PC6 PC7。
我在这路I2c上挂在了一颗MSA311的加速器模块,设置成功后,去读加速器模块的PARTID,看是否能够正常读写。
i2c初始化函数
void BOARD_I2C1_Init(void)
{
GPIO_Init_Type gpio_init;
/* PC6 - I2C1_SCL. */
gpio_init.Pins = GPIO_PIN_6;
gpio_init.PinMode = GPIO_PinMode_AF_OpenDrain;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &gpio_init);
GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_4);
/* PC7 - I2C1_SDA. */
gpio_init.Pins = GPIO_PIN_7;
gpio_init.PinMode = GPIO_PinMode_AF_OpenDrain;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &gpio_init);
GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_4);
/* Setup I2C initialization values. */
I2C_Master_Init_Type i2c_init;
i2c_init.ClockFreqHz = CLOCK_APB1_FREQ;
i2c_init.BaudRate = I2C_BaudRate_100K;
/* Initialize I2C master. */
I2C_InitMaster(I2C1, &i2c_init);
/* The target device address needs to be configured before enabling. */
I2C_SetTargetAddr(I2C1, APP_I2C_TARGET_ADDR);
/* Enable I2C. */
I2C_Enable(I2C1, true);
}
时钟初始化放在了clock_init.c中
2、读写函数封装
/* Write data to target device, true to writing succeed, false to writing failed. */
bool BOARD_I2c1_Write(uint8_t txlen, uint8_t *txbuf)
{
app_i2c_xfer.WaitTimes = APP_I2C_TIMEOUT_TIME;
app_i2c_xfer.TxBuf = txbuf;
app_i2c_xfer.TxLen = txlen;
I2C_Enable(I2C1, true); /* Disable I2C to clear tx fifo, and enabled I2C to perform the write operation again. */
if ( false == I2C_MasterWriteBlocking(I2C1, &app_i2c_xfer) )
{
return false;
}
else
{
return true;
}
}
/* Read data to target device, true to reading succeed, false to reading failed. */
bool BOARD_I2c1_Read(uint8_t rxlen, uint8_t *rxbuf)
{
app_i2c_xfer.WaitTimes = APP_I2C_TIMEOUT_TIME;
app_i2c_xfer.RxBuf = rxbuf;
app_i2c_xfer.RxLen = rxlen;
I2C_Enable(I2C1, true); /* Disable I2C to clear tx fifo, and enabled I2C to perform the read operation again. */
if ( false == I2C_MasterReadBlocking(I2C1, &app_i2c_xfer) )
{
return false;
}
else
{
return true;
}
}
3、读写msa311 PARTID
4、现象
所以读写没有问题。
5、代码
下载路径