硬汉嵌入式论坛

 找回密码
 立即注册
查看: 537|回复: 1
收起左侧

[有问必答] STM32硬件I2C没有响应

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2023-10-5 18:20:58 | 显示全部楼层 |阅读模式
stm32F103zet6硬件IIC发送起始信号没有响应,经过断点调试死循环在发送起始信号后的EV5事件,在EV5加上超时等待之后,又卡死在下一个标志位,估计EEPROM无法应答,求解




附上源代码
#include"i2c.h"
//配置I2C的GPIO
//配置I2C的工作模式
//编写write byte函数
//编写RANDOM read函数
//校验函数
//编写以及校验page write以及pag read函数
uint32_t T=10000;


void I2C_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        I2C_InitTypeDef I2C_InitStructure;
      
        // 打开IIC外设的时钟
        DEBUG_I2C_APBxClkCmd(DEBUG_I2C_CLK, ENABLE);
        // 打开SCL与SDA的时钟
        DEBUG_I2C_GPIO_APBxClkCmd(DEBUG_I2C_GPIO_SCL_CLK|DEBUG_I2C_GPIO_SDA_CLK, ENABLE);

        // 将I2C_SCL的GPIO配置为复用开漏模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_I2C_GPIO_SCL_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DEBUG_I2C_GPIO_SCL_PORT, &GPIO_InitStructure);

  // 将I2C_SDA的GPIO配置为复用开漏模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_I2C_GPIO_SDA_PIN ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
        GPIO_Init(DEBUG_I2C_GPIO_SCL_PORT, &GPIO_InitStructure);
      
        // 配置I2C的工作参数
        // 使能应答
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
        // 配置数据帧
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        // 配置波特率
        I2C_InitStructure.I2C_ClockSpeed = DEBUG_I2C_BAUDRATE ;
        // 配置占空比
        I2C_InitStructure.I2C_DutyCycle= I2C_DutyCycle_2;
        //配置工作模式
  I2C_InitStructure.I2C_Mode= I2C_Mode_I2C ;      
        //配置STM32自身地址
        I2C_InitStructure.I2C_OwnAddress1=I2C_STM32_OwnAddress1;

;
      
        // 完成I2C的初始化配置
        I2C_Init(I2C1, &I2C_InitStructure);      
      
      
        // 使能I2C
        I2C_Cmd(I2C1, ENABLE);            
}
void I2C_sendbyte(uint8_t addr,uint8_t data)
{
        //发送起始信号
        I2C_GenerateSTART (DEBUG_I2C_EEPROM,ENABLE);
        //检测ev5事件
        while(I2C_CheckEvent(DEBUG_I2C_EEPROM,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
        {
          if(T==0)
                {
                        break;
                }
                T--;
        }
        //发送要写入的EEPROM地址
        I2C_Send7bitAddress(DEBUG_I2C_EEPROM,I2C_EEPROM_Address,I2C_Direction_Transmitter);
        //检测ev6
        while(I2C_CheckEvent(DEBUG_I2C_EEPROM,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
        //发送的数据要写在什么地方
        I2C_SendData (DEBUG_I2C_EEPROM,addr);
        //检测ev8事件
        while(I2C_CheckEvent(DEBUG_I2C_EEPROM,I2C_EVENT_MASTER_BYTE_TRANSMITTING)==ERROR);
  //发送数据
        I2C_SendData (DEBUG_I2C_EEPROM,data);


        //检测ev8(形参应用完成时)
        while(I2C_CheckEvent(DEBUG_I2C_EEPROM,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
        //发送停止信号
        I2C_GenerateSTOP(DEBUG_I2C_EEPROM,ENABLE);
} QQ截图20231005172039.png QQ截图20231005172052.png QQ截图20231005172101.png QQ截图20231005172251.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2023-10-6 08:40:52 | 显示全部楼层
供参考
https://github.com/STMicroelectr ... 3210c_eval_eeprom.c

[C] 纯文本查看 复制代码
  *     +-----------------------------------------------------------------+
  *     |               Pin assignment for M24CXX EEPROM                 |
  *     +---------------------------------------+-----------+-------------+
  *     |  STM32F1xx I2C Pins                   |   EEPROM  |   Pin       |
  *     +---------------------------------------+-----------+-------------+
  *     | EEPROM_I2C_SDA_PIN/ SDA               |   SDA     |    5        |
  *     | EEPROM_I2C_SCL_PIN/ SCL               |   SCL     |    6        |
  *     | .                                     |   VDD     |    7 (3.3V) |
  *     | .                                     |   GND     |    8 (0 V)  |
  *     +---------------------------------------+-----------+-------------+



回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 14:20 , Processed in 0.342963 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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