野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14292|回复: 3

IIC程序死在CheckEvent里无法出来

[复制链接]
发表于 2016-9-15 19:14:16 | 显示全部楼层 |阅读模式
今天在练习IIC实验时,程序参考重新录制的视频写的,发现没有输出相应结果,调试时发现死在CheckEvent里无法出来,即在写字节函数中的事件EV5处停住没出来(//EV5事件被检测到,发送设备地址
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);),请问要怎样修改?
这是程序:

#include "bsp_i2c_eeprom.h"

void I2C_EEPROM_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  I2C_InitTypeDef  I2C_InitStructure;
       
        I2C_APBxClock_FUN(I2C_Clock,ENABLE);
        I2C_GPIO_APBxClock_FUN(I2C_GPIO_Clock,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin=I2C_SCL_PIN;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
        GPIO_Init(I2C_SCL_PORT,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin=I2C_SDA_PIN;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
        GPIO_Init(I2C_SDA_PORT,&GPIO_InitStructure);
       
        I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;
        I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;  
        I2C_InitStructure.I2C_ClockSpeed=I2C_Speed;
        I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_16_9 ;
        I2C_InitStructure.I2C_Mode=I2C_Mode_I2C ;
        I2C_InitStructure.I2C_OwnAddress1=I2CX_OWN_ADDRESS;
        I2C_Init(I2Cx, &I2C_InitStructure);
        I2C_Cmd(I2Cx, ENABLE);
}


void EEPROM_Byte_Write(uint8_t addr,uint8_t data)
{
        //发送起始信号
        I2C_GenerateSTART(I2Cx, ENABLE);
        //EV5事件被检测到,发送设备地址
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
       
        I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
        //EV6事件被检测到,发送要操作的存储单元地址
        I2C_SendData(I2Cx, addr);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTING)==ERROR);
        //EV8事件被检测到,发送要存储的数据
        I2C_SendData(I2Cx, data);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
        //数据传输完成
        I2C_GenerateSTOP(I2Cx, ENABLE);
}

void EEPROM_Byte_Read(uint8_t addr,uint8_t *data,uint8_t NumByteToRead)
{
//        while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
        //发送起始信号
        I2C_GenerateSTART(I2Cx, ENABLE);
        //检测EV5事件并清除标志
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
        /* 发送 EEPROM 设备地址+写方向 */
        I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        /* 检测 EV6 事件并清除标志*/
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
       
//        I2C_Cmd(I2Cx, ENABLE);
        /* 发送要读取的 EEPROM 内部地址(即 EEPROM 内部存储器的地址) */
        I2C_SendData(I2Cx, addr);
        /* 检测 EV8 事件并清除标志*/
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTING)==ERROR);
        //第二次起始信号
        //产生起始信号
        I2C_GenerateSTART(I2Cx, ENABLE);
        /* 检测 EV5 事件并清除标志*/
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)==        ERROR);
        /* 发送 EEPROM 设备地址 + 读方向*/
        I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Receiver);
        //事件6被检测到
        while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
        /* 读取 NumByteToRead 个数据*/
        while(NumByteToRead)
        {
                if(NumByteToRead==1)
                {
                        //如果为最后一个字节
                        I2C_AcknowledgeConfig(I2Cx, DISABLE);
                       
                }
                while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED)==ERROR);
                //事件7被检测到,即数据寄存器有新的有效数据
                *data=I2C_ReceiveData(I2Cx);
        }
       
        data++;
        NumByteToRead--;
        I2C_GenerateSTOP(I2Cx, ENABLE);
        //重新配置ACK使能,以便下次通讯
        I2C_AcknowledgeConfig(I2Cx, ENABLE);
}


void EEPROM_WaitForWriteEnd(void)
{
        do
        {
                I2C_GenerateSTART(I2Cx, ENABLE);
                while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_SB)==RESET);
               
                I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        }
        while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_ADDR)==RESET);
       
        I2C_GenerateSTOP(I2Cx, ENABLE);
}



回复

使用道具 举报

发表于 2016-9-16 08:57:15 来自手机 | 显示全部楼层
先下载历城测试下硬件有没问题,正常的话就一个个对比与历城的差异
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-16 16:46:06 | 显示全部楼层
问题终于解决了,我的工程文件是拷贝之前练习写的串口通信usart的程序,我虽然把优先级配置屏蔽了,但忘了把stm32f10x_it.c里边的中断函数给屏蔽掉,所以一直出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-16 16:47:14 | 显示全部楼层
flyleaf 发表于 2016-9-16 08:57
先下载历城测试下硬件有没问题,正常的话就一个个对比与历城的差异

问题终于解决了,我的工程文件是拷贝之前练习写的串口通信usart的程序,我虽然把优先级配置屏蔽了,但忘了把stm32f10x_it.c里边的中断函数给屏蔽掉,所以一直出错,谢谢你啦!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-12 21:56 , Processed in 0.037631 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表