你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教高手I2C的问题

[复制链接]
康师傅-94345 提问时间:2009-4-21 08:08 /
万利的EK-STM32F板子,MDK3.22a调试,下面这段程序:

void DMA_I2C1Reception(I2C_RWTypeDef* I2C_DataStruct)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
 CPU_SR    cpu_sr;
#endif
 u8  err;
 DMA_I2C1RxStructure.DMA_MemoryBaseAddr = I2C_DataStruct->DataBuffer;
 DMA_I2C1RxStructure.DMA_BufferSize = (u32)I2C_DataStruct->DataCount;
 DMA_Init(DMA1_Channel7, &DMA_I2C1RxStructure);
 OSSemPend(I2C1Sem, 0, &err);
 CPU_CRITICAL_ENTER();
 /*----- Transmission Phase -----*/
 /* While the bus is busy */
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 /* Send I2C1 START condition */
 I2C_GenerateSTART(I2C1, ENABLE);
 /* Test on I2C1 EV5 and clear it */
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 /* Send I2C2 slave Address for write */
 I2C_Send7bitAddress(I2C1, I2C_DataStruct->DeviceAddr, I2C_Direction_Transmitter);
 /* Test on I2C1 EV6 and clear it */
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
 /* Clear EV6 by setting again the PE bit */
 I2C_Cmd(I2C1, ENABLE);
 /* Send the EEPROM's internal address to write to */
 I2C_SendData(I2C1, I2C_DataStruct->DataAddr); 
 /* Test on EV8 and clear it */
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 /* Send STRAT condition a second time */ 
 I2C_GenerateSTART(I2C1, ENABLE);
 /* Test on EV5 and clear it */
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 /* Send EEPROM address for read */
 I2C_Send7bitAddress(I2C1, I2C_DataStruct->DeviceAddr, I2C_Direction_Receiver);
 /* Test on EV6 and clear it */
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
 /* Specifies that the next DMA transfer is the last one */
 I2C_DMALastTransferCmd(I2C1, ENABLE);
 /* Enable I2C1 DMA */
 I2C_DMACmd(I2C1, ENABLE);
 CPU_CRITICAL_EXIT();
 /* Enable DMA1 Channel7, Start I2C1_DMA reception */
 DMA_Cmd(DMA1_Channel7, ENABLE);
}

全速执行时程序在第三个的while死循环了,于是我这样试了一下:全速执行到这一行while(这一行还没执行,Run to Cursor line),查看SR1=0x0400,SR2=0x0003,出现了AF失败。试了第二种结果,全速执行到I2C_Send7bitAddress(I2C1, I2C_DataStruct->DeviceAddr, I2C_Direction_Transmitter);(Run to Cursor line)再F10(Step Over)执行这行,又出现了AF失败。又试了第三种结果,全速执行到I2C_GenerateSTART(I2C1, ENABLE);(这一行还没执行),查看SR1=SR2=0x0000,再全速执行到I2C_Cmd(I2C1, ENABLE);(这一行还没被执行,Run to Cursor line),正常。

这都是ST官方的操作流程,现在有点不明白I2C该如何操作了?
收藏 评论0 发布时间:2009-4-21 08:08

举报

0个回答

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版