打印

IIC程序死在CheckEvent里无法出来

[复制链接]
426|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
考哥|  楼主 | 2019-11-1 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天在练习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);
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

461

主题

477

帖子

0

粉丝