野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7689|回复: 3

I2C那块,跟着视频几乎完全一样抄的,但就是不行

[复制链接]
回帖奖励 6 火花 回复本帖可获得 3 火花奖励! 每人限 1 次(中奖概率 70%)
发表于 2022-4-8 00:02:55 | 显示全部楼层 |阅读模式
野火论坛202204072355362628..png 野火论坛202204072356056923..png

复制代码

野火论坛202204072353282293..png 野火论坛202204072354303720..png 野火论坛202204072355028719..png 野火论坛202204072358587929..png 野火论坛202204072356456890..png
  1. #include "bsp_iic.h"


  2. void I2C_EE_Config()
  3. {
  4.         I2C_InitTypeDef         I2C_InitStructure;
  5.         GPIO_InitTypeDef         GPIO_InitStructure;
  6.        
  7.         //开GPIOB时钟(用 | 同时能开两个)
  8.         EEPROM_I2C_GPIO_APBx_ClkCmd((EEPROM_I2C_SCL_GPIO_CLK|EEPROM_I2C_SDA_GPIO_CLK),ENABLE);
  9.        
  10.         //开I2C时钟
  11.         EEPROM_I2C_APBxClkCmd(RCC_APB1Periph_I2C1,ENABLE);
  12.        
  13.        
  14.         //配SCL
  15.         GPIO_InitStructure.GPIO_Pin=EEPROM_I2C_SCL_GPIO_PIN;
  16.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
  17.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  18.         GPIO_Init(EEPROM_I2C_SCL_GPIO_PORT,&GPIO_InitStructure);
  19.        
  20.         //配SDA
  21.         GPIO_InitStructure.GPIO_Pin=EEPROM_I2C_SDA_GPIO_PIN;
  22.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
  23.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  24.         GPIO_Init(EEPROM_I2C_SDA_GPIO_PORT,&GPIO_InitStructure);
  25.        
  26.         //配I2C
  27.         I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;//使能应答
  28.         I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
  29.         I2C_InitStructure.I2C_ClockSpeed=EEPROM_I2C_BAUDRATE;//时钟频率
  30.         I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
  31.         I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;
  32.         I2C_InitStructure.I2C_OwnAddress1=STM32_I2C_OWN_ADDR;
  33.         I2C_Init(EEPROM_I2C,&I2C_InitStructure);
  34.                
  35.         I2C_Cmd(EEPROM_I2C,ENABLE);//使能iic
  36.        
  37. }

  38. //*************************************  写一个字节  ************************************************
  39. void EEPROM_Byte_Write(uint8_t addr,uint8_t data)
  40. {
  41.        
  42.         I2C_GenerateSTART(EEPROM_I2C,ENABLE);//开始
  43.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
  44.        
  45.         //发送设备地址
  46.         I2C_Send7bitAddress (EEPROM_I2C,EEPROM_ADDR,I2C_Direction_Transmitter);
  47.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);       
  48.        
  49.         //数据地址(发送的第一个数据被当成地址)
  50.         I2C_SendData(EEPROM_I2C,addr);
  51.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
  52.                
  53.         //传数据
  54.         I2C_SendData(EEPROM_I2C,data);
  55.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
  56.        
  57.         I2C_GenerateSTOP(EEPROM_I2C,ENABLE);//停
  58. }


  59. //*************************************  读一个字节  ************************************************
  60. void EEPROM_READ(uint8_t addr,uint8_t *data,uint8_t num)
  61. {
  62.         I2C_GenerateSTART(EEPROM_I2C,ENABLE);//开始
  63.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
  64.        
  65.         I2C_Send7bitAddress (EEPROM_I2C,EEPROM_ADDR,I2C_Direction_Transmitter);//发送设备地址
  66.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);

  67.         I2C_SendData(EEPROM_I2C,addr);//数据要读的地址(发送的第一个数据被当成地址)
  68.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING)==ERROR);
  69.        
  70.        
  71.         //开始读--------------------------------------------------------------------
  72.         I2C_GenerateSTART(EEPROM_I2C,ENABLE);//开始
  73.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
  74.        
  75.         I2C_Send7bitAddress (EEPROM_I2C,EEPROM_ADDR,I2C_Direction_Receiver);//发送设备地址(读)
  76.         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)==ERROR);
  77.        
  78.        
  79.         while (num)
  80.         {
  81.                 if(num==1)//如果是读的最后一个数据,关应答
  82.                 {
  83.                         I2C_AcknowledgeConfig(EEPROM_I2C,DISABLE);
  84.                 }
  85.                
  86.                 *data=I2C_ReceiveData(EEPROM_I2C);
  87.                 while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_RECEIVED)==ERROR);
  88.                 num--;
  89.                 data++;
  90.         }
  91.         I2C_GenerateSTOP(EEPROM_I2C,ENABLE);//停
  92.         I2C_AcknowledgeConfig(EEPROM_I2C,ENABLE);//开应答,(应答默认状态为开)

  93. }


  94. void EEPROM_WaitForWriteEnd()
  95. {
  96.         do
  97.         {
  98.                 I2C_GenerateSTART(EEPROM_I2C,ENABLE);//开始
  99.                 while(I2C_GetFlagStatus(EEPROM_I2C,I2C_FLAG_SB)==RESET);
  100.                 I2C_Send7bitAddress (EEPROM_I2C,EEPROM_ADDR,I2C_Direction_Transmitter);//发送设备地址
  101.        
  102.         }
  103.         while(I2C_GetFlagStatus(EEPROM_I2C,I2C_FLAG_ADDR)==RESET);
  104.         I2C_GenerateSTOP(EEPROM_I2C,ENABLE);//停
  105. }





















复制代码


野火论坛202204072353576285..png
回复

使用道具 举报

 楼主| 发表于 2022-4-8 00:04:02 | 显示全部楼层
iic的宏

  1. #ifndef _BSP_IIC_H
  2. #define _BSP_IIC_H

  3. #include "stm32f10x.h"



  4. #define EEPROM_I2C                                                I2C1
  5. #define EEPROM_I2C_CLK                                        RCC_APB1Periph_I2C1
  6. #define EEPROM_I2C_APBxClkCmd                        RCC_APB1PeriphClockCmd//时钟使能函数
  7. #define EEPROM_I2C_BAUDRATE                                400000

  8. #define EEPROM_I2C_SCL_GPIO_CLK                        (RCC_APB2Periph_GPIOB)
  9. #define EEPROM_I2C_SDA_GPIO_CLK                        (RCC_APB2Periph_GPIOB)

  10. #define EEPROM_I2C_GPIO_APBx_ClkCmd                RCC_APB2PeriphClockCmd//时钟使能函数

  11. #define EEPROM_I2C_SCL_GPIO_PORT                GPIOB
  12. #define EEPROM_I2C_SCL_GPIO_PIN                        GPIO_Pin_6
  13. #define EEPROM_I2C_SDA_GPIO_PORT                GPIOB
  14. #define EEPROM_I2C_SDA_GPIO_PIN                        GPIO_Pin_7

  15. #define STM32_I2C_OWN_ADDR                                0x5F//随便写的(7位)
  16. #define EEPROM_ADDR                                                0xA0//看EEPRO手册,地址的部分位和引脚接法有关


  17. void EEPROM_READ(uint8_t addr,uint8_t *data,uint8_t num);
  18. void EEPROM_Byte_Write(uint8_t addr,uint8_t data);
  19. void I2C_EE_Config();
  20. void EEPROM_WaitForWriteEnd();
  21. #endif
复制代码
回复 支持 反对

使用道具 举报

发表于 2022-4-8 17:01:09 | 显示全部楼层
把#define 后面的//注释内容移动到上一行试试
回复 支持 反对

使用道具 举报

发表于 2022-4-13 10:25:46 | 显示全部楼层
肯定是抄错了               
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 07:37 , Processed in 0.042891 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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