我将 I2C1外设与 AT24CM01 EEPROM 搭配使用。 我正在尝试将一些虚拟 值写入 EEPROM、以查看是否可以正确地写入和读取数据。 下面的代码写入 器件的地址 、后跟 一 个2字节存储器地址、后跟50个数据字节。 数据字节的值从0递增到49。
我遇到的问题是缺少数据字节。 例如、当我在示波器上观察传输时、数据字节应该从0增加到 49、但当它运行时 、数据字节被跳过。 (即 1->3->6->9等,而不是0->1->2->3)
如果我 在代码中插入断点(如下突出显示) 、则每个字节都被正确写入、并且代码 工作正常。 删除断点后、会跳过数据字节。 I2CMCS 寄存器中的 BUSY 位似乎从未设置为"1"、因为数据正在计时输出。 我已经包含了用于 设置 I2C1外设的相关代码片段以及简单的测试代码。
我是否错过了设置步骤?
谢谢、
Joe
#define EXTERNAL_MEM_PERIPh I2C1_BASE
void main (void)
{
//--设置 I2C 端口--
TD_Init_I2CPorts (dwSystemClock); //dwSystemClock = 120MHz
ExternalMem_Init (external_MEM_Periph);
}
// 初始化例程
静态空 TD_Init_I2CPorts (uint32_t dwSystemClock)
{
//-启用 I2C1
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);
while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_I2C1))
{
}
///-使能 I2C1的端口 G 引脚
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
//--为 I2C 配置 G0和 G1
ROM_GPIOPinConfigure (GPIO_PG0_I2C1SCL);
ROM_GPIOPinConfigure (GPIO_PG1_I2C1SDA);
ROM_GPIOPinTypeI2C (GPIO_PORTG_base、GPIO_PIN_1);
ROM_GPIOPinTypeI2CSCL (GPIO_PORTG_BASE、GPIO_PIN_0);
//将传输速度设置为400kbps 并脱离系统时钟运行
I2CMasterInitExpClk (I2C1_base、dwSystemClock、true);
}
//虚拟变量写入操作
uint32_t externalMem_Init (uint32_t dwCommPort)
{
uint32_t dwNumberofBytes = 50;
uint32_t i;
volatile uint32_t dwSlaveAdd;
uint32_t byLowerAddress = 0x0A;
volatile uint32_t byData = 0;
volatile uint32_t counter = 0;
volatile uint32_t dwReturnedData[50];
volatile uint32_t dwError = 0x000;
dwSlaveAdd = EXT_MEM_SLAVE_ADDRESS | EXT_MEM_WRITE | EXT_MEM_LOWE_PAGES;
I2CSlaveAddressSet (external_MEM_Periph、0、dwSlaveAdd);
//--发送从机地址和上地址
HWREG (external_MEM_Periph + I2C_O_MSA)= dwSlaveAdd;
I2CMasterDataPut (external_MEM_Periph、0x00);
while (I2CMasterBusy (external_MEM_Periph))
{
}
I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_SEND_START);
while (I2CMasterBusy (external_MEM_Periph))
{
}
//--发送存储器地址的低字节
I2CMasterDataPut (external_MEM_Periph、byLowerAddress); //此处为断点
I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_send_cont);
while (I2CMasterBusy (external_MEM_Periph))
{
}
//写入数据
for (i=0;i < dwNumberofBytes;i++)
{
I2CMasterDataPut (external_MEM_Periph、byData); //此处为断点
if (((i+1)=dwNumberofBytes)
{
I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_send_finish);
}
其他
{
I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_send_cont);
}
//--等待 Master 完成
while (I2CMasterBusy (external_MEM_Periph))
{
}
byData++;
}