This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
我需要在 EEPROM 中写入数据、可以使用突发写入模式。 由于我现在没有 EEPROM、因此我要使用另一个微控制器作为从设备。
MAP_I2CMasterSlaveAddrSet (I2C2_BASE、SLAVE_ADDRESS、FALSE);
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_START);
while (dataIndex < 6)
{
MAP_I2CMasterDataPut (I2C2_BASE、EEPROM_w[dataIndex]);
if ((dataIndex < 4))
{
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
}
否则 if (dataIndex == 4)
{
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
}
UARTprintf ("EEPROM write[%d]= 0x%x\n" 、dataIndex、EEPROM_w[dataIndex]);
dataIndex++;
}
dataIndex=0;
while (MAP_I2CMasterBusy (I2C2_BASE))
{
}
预期数据 EEPROM[6]={0xAA、0xBB、0xCC、0xDD、0xFF、0xEE};
写入后、我尝试使用突发读取模式进行读取。
EEPROM 读取[0]= 0xAA
EEPROM 读取[1]= 0xAA
EEPROM 读取[2]= 0xbb
EEPROM READ[3]= 0xcc
EEPROM READ[4]= 0xdd
EEPROM READ[5]= 0xff
0xAA 重复两次、最后一个0xee 缺失
能不能更正我遗漏的地方?
您好!
请更改以下内容。 我希望它能解决您的问题。
发件人:
while (MAP_I2CMasterBusy (I2C2_BASE))
{
}
收件人:
while ( ! map_I2CMasterBusy (I2C2_base)//将这3行添加到下面原始行的所有位置
{
}
while (map_I2CMasterBusy (I2C2_BASE)//您还保留了这三个原始行。 不要将其移除。
{
}
您好、Charles、
感谢您的答复
我尝试过,正如你所提到的,我看到同样的问题再次发生。 此外、该代码仍停留在以下行中。
while ( ! map_I2CMasterBusy (I2C2_base)//将这3行添加到下面原始行的所有位置
{
}
可能是因为 UARTprintf。
您能在下面尝试一下吗?
发件人:
if( (dataIndex < 4))
{
MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
}
else if(dataIndex == 4)
{
MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
}
收件人:
if( (dataIndex < 4))
{
MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
while(!MAP_I2CMasterBusBusy(I2C2_BASE)); // Add this line
while(MAP_I2CMasterBusBusy(I2C2_BASE)); // Keep this line.
}
else if(dataIndex == 4)
{
MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
while(!MAP_I2CMasterBusBusy(I2C2_BASE)); // Add this line
while(MAP_I2CMasterBusBusy(I2C2_BASE)); // Keep this line.
}
您好、Charles、
我尝试做同样的,但它是卡在下面的行本身。 我试图使用步越也,在第一个索引本身,它被卡在那里,没有走出这一行.
while (map_I2CMasterBusy (I2C2_base)); //保留此行。
请引导我完成此操作。
也可以共享其他微控制器中使用的从代码片段
uint8_t EEPROM_DATA[6]={0x00、0x00、0x00、0x00、0x00};
void I2C2_IRQHandler (void)
{
uint32_t getIntStatus;
uint32_t getStatus;
//获取中断状态并清除相同的状态
getIntStatus = MAP_I2CSlaveIntStatusEx (I2C2_BASE、TRUE);
MAP_I2CSlaveIntClearEx (I2C2_BASE、getIntStatus);
//获取数据方向的状态
getStatus = MAP_I2CSlaveStatus (I2C2_BASE);
//检查我们是否有数据请求
if (((getIntStatus 和 I2C_SLAVE_INT_DATA)== I2C_SLAVE_INT_DATA)
{
// 处理发送路径的数据中断
if (((getStatus & I2C_SLAVE_ACT_RREQ)== I2C_SLAVE_ACT_RREQ)
{
//dataIndex=0;
// data = MAP_I2CSlaveDataGet (I2C2_BASE);
EEPROM_DATA[dataIndex++]= MAP_I2CSlaveDataGet (I2C2_BASE);
}
//通过反转数据处理发送路径的数据中断
//发送之前。
if (getStatus == I2C_SLAVE_ACT_TREQ)
{
MAP_I2CSlaveDataPut (I2C2_BASE、EEPROM_DATA[dataIndex++]);
//map_I2CSlaveDataPut (I2C2_BASE、~(getDataBuff[dataIndex++]);
}
}
//检查总线上是否有停止条件
if (((getIntStatus & I2C_SLAVE_INT_STOP)== I2C_SLAVE_INT_STOP)
{
// 清除索引标志
dataIndex = 0;
}
}
突发读取可以正常工作、只有突发写入才会出现此问题。
您好!
您能再次发布修改过的代码吗? 只有您写入 I2C 器件的函数就足够了。 我不需要与 I2C 操作无关的其余代码。 我想看看是否遗漏了任何东西。
您好、Charles、
//写入到从属设备
MAP_I2CMasterSlaveAddrSet (I2C2_BASE、SLAVE_ADDRESS、FALSE);
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_START);
while (dataIndex < 6)
{
MAP_I2CMasterDataPut (I2C2_BASE、EEPROM_w[dataIndex]);
if ((dataIndex < 4))
{
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
while (! MAP_I2CMasterBusy (I2C2_BASE);
while (MAP_I2CMasterBusy (I2C2_BASE));//代码自身滞留在此处、未继续执行。
}
否则 if (dataIndex == 4)
{
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
while (! MAP_I2CMasterBusy (I2C2_BASE);
while (MAP_I2CMasterBusy (I2C2_BASE));
}
UARTprintf ("EEPROM write[%d]= 0x%x\n"、dataIndex、EEPROM_w[dataIndex]);
dataIndex++;
}
dataIndex=0;
为了进行测试、我要读回它。 阅读效果很好、因为我也将此相同代码用于其他应用。
MAP_I2CMasterSlaveAddrSet (I2C2_BASE、SLAVE_ADDRESS、TRUE);
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);
while (dataIndex < 6)
{
MAP_SysCtlDelay (10000);
EEPROM_w_check[dataIndex]= MAP_I2CMasterDataGet (I2C2_base);
// map_SysCtlDelay (10000);
if ((dataIndex < 4))
{
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);
// map_SysCtlDelay (10000000);
}
否则 if (dataIndex == 4)
{
MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
}
UARTprintf ("EEPROM Read[%d]= 0x%x\n" 、dataIndex、EEPROM_w_check[dataIndex]);
dataIndex++;
}
谢谢
您好!
下面是循环遍历6个数据元素的行。 但是、调用 MAP_I2CMasterControl 的条件取决于 dataIndex=4还是 dataIndex<4。 当 dataIndex 为5时会发生什么情况?
while (dataIndex < 6)
如果要传输六个元素、 则不应该从 dataIndex < 4更 改为 dataIndex < 5、而对于 dataIndex == 4更改为 dataIndex == 5也是如此。