添加i2c功能
1 启动i2c功能
#ifdef MY_I2C
io_cfg.useI2C = CyTrue;
#else
io_cfg.useI2C = CyFalse;
#endif
2 初始化i2c模块
#ifdef MY_I2C
CyU3PReturnStatus_t
My_I2c_Init (void)
{
CyU3PI2cConfig_t i2cConfig;
CyU3PReturnStatus_t status = CY_U3P_SUCCESS;
/* Initialize and configure the I2C master module. */
status = CyU3PI2cInit();
if (status != CY_U3P_SUCCESS)
{
return status;
}
/* Start the I2C master block. The bit rate is set at 10KHz. */
CyU3PMemSet ((uint8_t *)&i2cConfig, 0, sizeof(i2cConfig));
i2cConfig.bitRate = 10000; /* 10 KHz ,速度太快读写可能异常100k err.*/
i2cConfig.busTimeout = 0xFFFFFFFF;
i2cConfig.dmaTimeout = 0xFFFF;
i2cConfig.isDma = CyFalse;
status = CyU3PI2cSetConfig (&i2cConfig, NULL);
if (status == CY_U3P_SUCCESS)
{
return status;
}
return status;
}
3 编写i2c读写函数
以下两个函数AD_Write,AD_Read 用于8bit寄存器地址,8bit数据。
当然 8bit的slave address.
CyU3PReturnStatus_t
AD_Write (//ref_AN75779
uint8_t slaveAddr,
uint8_t regAddr,
uint8_t data)
{
CyU3PReturnStatus_t status = CY_U3P_SUCCESS;
CyU3PI2cPreamble_t preamble;
uint8_t buf[1];
buf[0] = data;
preamble.buffer[0] = slaveAddr;
preamble.buffer[1] = regAddr;
preamble.length = 2;
preamble.ctrlMask = 0x0000;
status = CyU3PI2cTransmitBytes (&preamble, buf, 1, 0);
CyU3PBusyWait(5) ;//CyU3PThreadSleep(10);//100.200:color not right.(speed)
return status;
}
CyU3PReturnStatus_t
AD_Read (
uint8_t slaveAddr,
uint8_t regAddr,
uint8_t *buf)
{
CyU3PReturnStatus_t status = CY_U3P_SUCCESS;
CyU3PI2cPreamble_t preamble;
preamble.buffer[0] = slaveAddr & I2C_SLAVEADDR_MASK;
preamble.buffer[1] = regAddr;
preamble.buffer[2] = slaveAddr;
preamble.length = 3;
preamble.ctrlMask = 0x0002; /* slaveAddrPos: Send start bit after 2 byte of preamble.!! */
status = CyU3PI2cReceiveBytes (&preamble, buf, 1, 0);
CyU3PBusyWait(5);
return status;
}
#endif
测试读写i2c寄存器ok,代码木有问题。