typedef enum I2CChannel { TM4C_I2C0 = 0, TM4C_I2C1, TM4C_I2C2, TM4C_I2C3, TM4C_I2C4, TM4C_I2C5, TM4C_I2C6, TM4C_I2C7, TM4C_I2C8, TM4C_I2C9, TM4C_I2C_NUM, }tI2CChannel; typedef struct { uint8_t ulSCLPins; uint8_t ulSDAPins; uint32_t ulPinsBase; uint32_t ulPinPerID; uint32_t ulI2CPerID; uint32_t ulSCLPinType; uint32_t ulSDAPinType; }tI2CDev; uint32_t ul32I2CBaseAddress[TM4C_I2C_NUM] = { I2C0_BASE, I2C1_BASE, I2C2_BASE, I2C3_BASE, I2C4_BASE, I2C5_BASE, I2C6_BASE, I2C7_BASE, I2C8_BASE, I2C9_BASE, }; tI2CDev g_tI2CCfg = {//I2C0 GPIO_PIN_2,//SCL GPIO_PIN_3,//SDA GPIO_PORTB_BASE, SYSCTL_PERIPH_GPIOB, SYSCTL_PERIPH_I2C0, GPIO_PB2_I2C0SCL, GPIO_PB3_I2C0SDA }, uint8_t g_ucDevAddr = 0xA0 //I2C初始化 void BSP_I2CMasterInit(tI2CChannel Channel, tI2CDev tI2CDev, bool bFast, uint32_t ulSysClk) { SysCtlPeripheralEnable(tI2CDev.ulPinPerID); while(!SysCtlPeripheralReady(tI2CDev.ulPinPerID)); SysCtlPeripheralDisable(tI2CDev.ulI2CPerID); SysCtlPeripheralReset(tI2CDev.ulI2CPerID); SysCtlPeripheralEnable(tI2CDev.ulI2CPerID); while(!SysCtlPeripheralReady(tI2CDev.ulI2CPerID)); GPIOPinConfigure(tI2CDev.ulSCLPinType); GPIOPinConfigure(tI2CDev.ulSDAPinType); //GPIOPinTypeI2C(tI2CDev.ulPinsBase,tI2CDev.ulSDAPins|tI2CDev.ulSCLPins); GPIOPinTypeI2C(tI2CDev.ulPinsBase,tI2CDev.ulSDAPins); GPIOPinTypeI2CSCL(tI2CDev.ulPinsBase,tI2CDev.ulSCLPins); I2CMasterInitExpClk(ul32I2CBaseAddress[Channel],ulSysClk,bFast); //I2CMasterIntDisable(ul32I2CBaseAddress[Channel]); } // 非阻塞忙判断 static bool BSP_I2CMasterBusyNoBlocking(tI2CChannel Channel) { uint32_t usRepeat = 0u; //等待完成 while(I2CMasterBusy(ul32I2CBaseAddress[Channel]) == (UINT8)true) { usRepeat++; if ((usRepeat) > 8000000u) { return false; } } return true; } // 错误检测 bool BSP_I2CErrorCheck(tI2CChannel Channel) { uint32_t status; // 等待完成 if (BSP_I2CMasterBusyNoBlocking(Channel) == true) { // 读取错误 status = I2CMasterErr(ul32I2CBaseAddress[Channel]); if (!status) { return true; } } return false; } bool BSP_EepromWrite(tI2CChannel Channel, uint8_t ucSlaveAddr, uint16_t usChipAddr,uint8_t *pData, uint8_t ucLen) { uint8_t ucIndex; uint8_t Epstatus = EEPROM_OP_IDLE; uint32_t ulI2CCtrl; ulI2CCtrl = I2C_MASTER_CMD_BURST_SEND_START; while(Epstatus != EEPROM_OP_STOP) { switch(Epstatus) { case EEPROM_OP_IDLE: {//空闲状态, //向从机写数据 I2CMasterSlaveAddrSet(I2C0_BASE, ucSlaveAddr, false); //发送存储地址高8位 I2CMasterDataPut(I2C0_BASE, (usChipAddr >> 8)); I2CMasterControl(I2C0_BASE, ulI2CCtrl);// 起始位 if(!BSP_I2CErrorCheck(Channel)) { return false; } Epstatus = EEPROM_OP_TXADDR; } break; case EEPROM_OP_TXADDR: { ulI2CCtrl = I2C_MASTER_CMD_BURST_SEND_CONT; I2CMasterDataPut(I2C0_BASE, (usChipAddr & 0xff));//发送存储地址低8位 I2CMasterControl(I2C0_BASE, ulI2CCtrl); if(!BSP_I2CErrorCheck(Channel)) { return false; } Epstatus = EEPROM_OP_TXDATA; } break; case EEPROM_OP_TXDATA: { ucIndex = 0;//发送数据 while(ucIndex < ucLen) { if(ucIndex == (ucLen - 1)) { ulI2CCtrl = I2C_MASTER_CMD_BURST_SEND_FINISH; } else { ulI2CCtrl = I2C_MASTER_CMD_BURST_SEND_CONT; } I2CMasterDataPut(I2C0_BASE, pData[ucIndex++]); I2CMasterControl(I2C0_BASE, ulI2CCtrl); if(!BSP_I2CErrorCheck(Channel)) { return false; } } Epstatus = EEPROM_OP_STOP; } break; default:return false; } } return true; } bool BSP_EepromRead(tI2CChannel Channel, uint8_t ucSlaveAddr, uint16_t usChipAddr,uint8_t *pData, uint8_t ucLen) { uint8_t ucIndex; uint8_t Epstatus = EEPROM_OP_IDLE; while(Epstatus != EEPROM_OP_STOP) { switch(Epstatus) { case EEPROM_OP_IDLE: { I2CMasterSlaveAddrSet(I2C0_BASE, ucSlaveAddr, false); I2CMasterDataPut(I2C0_BASE, (usChipAddr >> 8)); I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START); if(!BSP_I2CErrorCheck(Channel)) { return false; } Epstatus = EEPROM_OP_TXADDR; } break; case EEPROM_OP_TXADDR: { I2CMasterDataPut(I2C0_BASE, (usChipAddr & 0xff)); I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); if(!BSP_I2CErrorCheck(Channel)) { return false; } Epstatus = EEPROM_OP_RXDATA; } break; case EEPROM_OP_RXDATA: { ucIndex = 0; // 从机读出数据 I2CMasterSlaveAddrSet(I2C0_BASE, ucSlaveAddr, true); if(ucLen == 1) { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE); if(!BSP_I2CErrorCheck(Channel)) { return false; } pData[ucIndex++] = I2CMasterDataGet(I2C0_BASE); } else { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);//读起始位 if(!BSP_I2CErrorCheck(Channel)) { return false; } pData[ucIndex++] = I2CMasterDataGet(I2C0_BASE); while(ucIndex < ucLen) { if(ucIndex == (ucLen - 1)) { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH); } else { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT); } if(!BSP_I2CErrorCheck(Channel)) { return false; } pData[ucIndex++] = I2CMasterDataGet(I2C0_BASE); } Epstatus = EEPROM_OP_STOP; } } break; default:return false; } } return true; } void AT24C256Test(void) { bool status; BSP_I2CMasterInit(g_tI2CChannel,g_tI2CCfg,false,ulSysClk); BSP_I2CMasterEnable(g_tI2CChannel,true); while(1) { status = BSP_EepromWrite(g_tI2CChannel,g_ucDevAddr,0x0000,g_EpromWriteData,10); if(status) { status = BSP_EepromRead(g_tI2CChannel,g_ucDevAddr,0x0000,g_EpromReadData,10); } SimpleDelay(2); } }
现象描述:不能读/写EEPROM数据
波形上每次读写只能抓到一个字节,每帧第一个字节应该是从机地址及读写标志,但是读波形又不是从机地址0xA0,实在不清楚原因,特在此求助各位大神!