|
楼主 |
发表于 2015-2-9 12:00:19
|
显示全部楼层
谢谢版主回复,我只有KE02的板子没有KL25实验不了。
程序在官网下载了,看不懂。
LDD_TError I2C2_MasterReceiveBlock(LDD_TDeviceData *DeviceDataPtr, LDD_TData *BufferPtr, LDD_I2C_TSize Size, LDD_I2C_TSendStop SendStop)
{
I2C2_TDeviceData *DeviceDataPrv = (I2C2_TDeviceData *)DeviceDataPtr;
if (Size == 0x00U) { /* Test variable Size on zero */
return ERR_OK; /* If zero then OK */
}
if (SendStop == LDD_I2C_NO_SEND_STOP) { /* Test variable SendStop on supported value */
return ERR_PARAM_MODE; /* If not supported value then error */
}
if ((DeviceDataPrv->SerFlag & GENERAL_CALL) != 0x00U) { /* Is the general call flag set (SelectSlaveDevice - address type is general call) ? */
return ERR_NOTAVAIL; /* It is not possible to receive data - Call SelectSlaveDevice method */
}
if (DeviceDataPrv->SendStop == LDD_I2C_SEND_STOP) {
if ((I2C_PDD_GetBusStatus(I2C0_BASE_PTR) == I2C_PDD_BUS_BUSY) || /* Is the bus busy? */ \
((DeviceDataPrv->SerFlag & MASTER_IN_PROGRES) != 0x00U) || \
(DeviceDataPrv->InpLenM != 0x00U)) {
return ERR_BUSY; /* If yes then error */
}
} else {
if(((DeviceDataPrv->SerFlag & MASTER_IN_PROGRES) != 0x00U) || /* Is the bus busy? */ \
(DeviceDataPrv->InpLenM != 0x00U)) {
return ERR_BUSY; /* If yes then error */
}
}
/* {Default RTOS Adapter} Critical section begin, general PE function is used */
EnterCritical();
DeviceDataPrv->SerFlag |= MASTER_IN_PROGRES; /* Set flag "busy" */
DeviceDataPrv->InpPtrM = (uint8_t *)BufferPtr; /* Save pointer to data for reception */
DeviceDataPrv->InpLenM = Size; /* Set the counter of input bufer's content */
DeviceDataPrv->SendStop = SendStop; /* Set generating stop condition */
I2C_PDD_SetTransmitMode(I2C0_BASE_PTR, I2C_PDD_TX_DIRECTION); /* Set TX mode */
if (I2C_PDD_GetMasterMode(I2C0_BASE_PTR) == I2C_PDD_MASTER_MODE) { /* Is device in master mode? */
I2C_PDD_RepeatStart(I2C0_BASE_PTR); /* If yes then repeat start cycle generated */
} else {
I2C_PDD_SetMasterMode(I2C0_BASE_PTR, I2C_PDD_MASTER_MODE); /* If no then start signal generated */
}
if ((DeviceDataPrv->SerFlag & ADDR_7) != 0x00U) { /* Is 7-bit addressing set ? */
DeviceDataPrv->SerFlag |= (ADDR_COMPLETE|REP_ADDR_COMPLETE); /* Only one byte of address will be sent 7-bit address mode*/
I2C_PDD_WriteDataReg(I2C0_BASE_PTR, (uint8_t)(DeviceDataPrv->SlaveAddr | 0x01U)); /* Send slave address */
} else {
if ((DeviceDataPrv->SerFlag & ADDR_10) != 0x00U) { /* Is 10-bit addressing set ? */
DeviceDataPrv->SerFlag &= (uint8_t)~(ADDR_COMPLETE | REP_ADDR_COMPLETE); /* Second byte of address will be sent later */
I2C_PDD_WriteDataReg(I2C0_BASE_PTR, DeviceDataPrv->SlaveAddrHigh); /* Send slave address - high byte*/
}
}
/* {Default RTOS Adapter} Critical section end, general PE function is used */
ExitCritical();
return ERR_OK; /* OK */
}
不明白怎么实现读的。
对比波形我的在每一字节后明显有明显的一段时钟低电平,请问是什么原因造成的。
而且从波形上看我的也是符合IIC协议的。 |
|