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,实在不清楚原因,特在此求助各位大神!