|
芯片是N32G455VEL7,工具是keil5,用DMA來(lái)控制I2C寫eeprom 程序如下
void I2C_EE_PageWrite(u8* pBuffer, u16 WriteAddr, u16 NumByteToWrite)
{
DMA_InitType DMA_InitStructure;
/* enter rountine safely */
/* DMA initialization */
DMA_DeInit(DMA1_CH4);
DMA_InitStructure.PeriphAddr = (u32)&I2Cx->DAT;
DMA_InitStructure.MemAddr = (u32)pBuffer;
DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST
DMA_InitStructure.BufSize = NumByteToWrite
DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
DMA_InitStructure.PeriphDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.CircularMode = DMA_MODE_NORMAL;
DMA_InitStructure.Priority = DMA_PRIORITY_VERY_HIGH;
DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
DMA_Init(DMA1_CH4, &DMA_InitStructure);
I2C_ConfigAck(I2Cx, ENABLE);
I2C_GenerateStart(I2Cx, ENABLE);
while (!I2C_CheckEvent(I2Cx, I2C_EVT_MASTER_MODE_FLAG)) // EV5
{
};
I2C_SendAddr7bit(I2Cx, EEPROM_ADDR, I2C_DIRECTION_SEND);
while (!I2C_CheckEvent(I2Cx, I2C_EVT_MASTER_TXMODE_FLAG)) // EV6
{
};
I2C_SendData(I2Cx, WriteAddr);//地址
while (!I2C_CheckEvent(I2Cx, I2C_EVT_MASTER_DATA_SENDED))
{
};
I2C_EnableDMA(I2Cx, ENABLE);
DMA_EnableChannel(DMA1_CH4, ENABLE);
while (!DMA_GetFlagStatus(DMA1_FLAG_TC4, DMA1))
;
I2C_GenerateStop(I2Cx, ENABLE);
I2C_EE_WriteOnePageCompleted();
}
我已經(jīng)將數(shù)據(jù)發(fā)送到數(shù)據(jù)寄存器中了,然后怎么寫到eeprom中呢?不應(yīng)該自動(dòng)寫嗎?難道我要通過(guò) I2C_SendData()函數(shù)循環(huán)寫入?
|
|