S32K312 I2C读取从机寄存器代码
时间: 2023-07-09 18:32:52 浏览: 179
以下在 S32K312 上 S32 SDK (SDK S32K) 的 I2C 库函数读取从机寄存器的示例代码:
```
#include "fsl_i2c.h"
i2c_master_handle_t g_m_handle;
volatile bool g_MasterCompletionFlag = false;
void i2c_master_callback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData)
{
if (status == kStatus_Success)
{
g_MasterCompletionFlag = true;
}
}
status_t i2c_master_init(I2C_Type *base, uint32_t baudrate)
{
i2c_master_config_t masterConfig;
uint32_t sourceClock;
/* 获取 I2C 模块时钟源频率 */
sourceClock = CLOCK_GetFreq(I2C0_CLK_SRC);
/* 初始化 I2C 主机配置结构体 */
I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = baudrate;
/* 初始化 I2C 主机 */
I2C_MasterInit(base, &masterConfig, sourceClock);
/* 设置 I2C 主机回调函数 */
I2C_MasterTransferCreateHandle(base, &g_m_handle, i2c_master_callback, NULL);
return kStatus_Success;
}
status_t i2c_master_read_register(I2C_Type *base, uint8_t slaveAddr, uint8_t regAddr, uint8_t *data, uint32_t dataSize)
{
i2c_master_transfer_t masterXfer;
/* 初始化 I2C 传输结构体 */
memset(&masterXfer, 0, sizeof(masterXfer));
masterXfer.slaveAddress = slaveAddr;
masterXfer.direction = kI2C_Write;
masterXfer.subaddress = regAddr;
masterXfer.subaddressSize = 1;
masterXfer.data = NULL;
masterXfer.dataSize = 0;
masterXfer.flags = kI2C_TransferDefaultFlag;
/* 发送从机寄存器地址 */
if (I2C_MasterTransferNonBlocking(base, &g_m_handle, &masterXfer) != kStatus_Success)
{
return kStatus_Fail;
}
/* 等待传输完成 */
while (!g_MasterCompletionFlag)
{
}
g_MasterCompletionFlag = false;
/* 初始化 I2C 传输结构体 */
memset(&masterXfer, 0, sizeof(masterXfer));
masterXfer.slaveAddress = slaveAddr;
masterXfer.direction = kI2C_Read;
masterXfer.subaddress = 0;
masterXfer.subaddressSize = 0;
masterXfer.data = data;
masterXfer.dataSize = dataSize;
masterXfer.flags = kI2C_TransferDefaultFlag;
/* 读取从机寄存器数据 */
if (I2C_MasterTransferNonBlocking(base, &g_m_handle, &masterXfer) != kStatus_Success)
{
return kStatus_Fail;
}
/* 等待传输完成 */
while (!g_MasterCompletionFlag)
{
}
g_MasterCompletionFlag = false;
return kStatus_Success;
}
```
上述代码中,使用了 S32 SDK 提供的 I2C 库函数,其中 `I2C0` 是 I2C 模块的实例,`slaveAddr` 是从机地址,`regAddr` 是从机寄存器地址,`data` 是读取的数据,`dataSize` 是读取数据的长度。函数首先发送从机寄存器地址,然后再读取从机寄存器中的数据。函数返回值是操作的状态,可以根据返回值判断操作是否成功。函数中使用了中断调用方式,`i2c_master_callback()` 函数是 I2C 主机传输完成时的回调函数。