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

使用CubMX和Proteus学习STM32单片机(四)------24C02(模拟IIC)

[复制链接]
STMCU小助手 发布时间:2022-12-31 18:58
项目简介
        利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第四部分针对EEPROM 24C02的一个实例,IIC通信是一种比较典型的串行通信方式,在很多情况下都会有所使用,了解并熟悉IIC通信就显得十分重要。本项目之所以使用模拟IIC,而没有使用STM32单片机内置的硬件IIC,主要由于Half库里IIC的坑太多了,自己一开始也是想通过HAL库来开发,但是始终不成功,也有可能仿真软件也有些坑,如果有能够做出来的大佬,也欢迎评论区或私聊我交流,不过在实物32单片机开发板上网上好像验证过可用,但是手上暂时缺开发板,针对硬件IIC这一块的内容,以后有时间会完善。

硬件模块

        STM32F103R4
        24C02
        串口模块

软件工具
        CubMX
        Proteus
        KEIL

电路连接图
        
715@R7ZH0J1$_E5`CM`PY.png

8V813Z807J4WRX`TII9D}YX.png

工作流程
        首先创建一个CubMX工程,如果是配置硬件IIC很容易,只要简单选择一下就可以了

G2G%ZZKGJ%YQM_`S~{Z5E7M.png

        默认是标准模式,速度是100kHz,可以选择高速模式400kHz,其余可以保持默认,当然这是硬件IIC的配置方法,咱们用的是模拟IIC,相应的引脚设置在后面生成的Keil工程里编写相应程序即可。

FF}D`)D)JY[SNQF5L4_OI@7.png

        其余也是保持默认即可

WP26K(72WSUFAPZAMUTL2@F.png

)9`AX4JT@K5NZB}HNC5JZG1.png

        之后,在生成的KEIL工程中编写相应的程序,这部分在后面会列出。

        然后就是验证了。将提前设置的一组数据写入进24C02中,然后从24C02中读取出来,并用串口打印,提前设置的数据是{1,2,3,4,5,6,7,0} ,串口打印出的数据如下:

}P%8HH1%Q9(WZ{SG_F5I3WE.png

程序代码

        main.c
  1. uint8_t WriteBuffer[2*BufferSize] = {1,2,3,4,5,6,7,0};        //需要写的数据在WriteBuffer当中
  2.         uint8_t ReadBuffer[2*BufferSize]={0};                                                                //读出来的数据放进ReadBuffer当中
  3.         uint8_t i;
  4.         uint8_t data_addr = 0x01;
  5. /* USER CODE END 0 */

  6. //重定向printf()到串口发送和接收,方便应用
  7. int fputc(int ch, FILE *f){
  8. uint8_t temp[1] = {ch};
  9. HAL_UART_Transmit(&huart1, temp, 1, 0xffff);
  10. return ch;
  11. }
  12. //重定向scanf()函数和getchar()函数,方便应用
  13. int fgetc(FILE * f)
  14. {
  15.   uint8_t ch = 0;
  16.   HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
  17.   return ch;
  18. }

  19. /**
  20.   * @brief  The application entry point.
  21.   * @retval int
  22.   */
  23. int main(void)
  24. {
  25.   /* MCU Configuration--------------------------------------------------------*/

  26.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  27.   HAL_Init();

  28.   /* USER CODE BEGIN Init */

  29.   /* USER CODE END Init */

  30.   /* Configure the system clock */
  31.   SystemClock_Config();

  32.   /* USER CODE BEGIN SysInit */

  33.   /* USER CODE END SysInit */

  34.   /* Initialize all configured peripherals */
  35.   MX_GPIO_Init();
  36.   MX_USART1_UART_Init();
  37.   /* USER CODE BEGIN 2 */

  38.   /* USER CODE END 2 */

  39.   /* Infinite loop */
  40.   /* USER CODE BEGIN WHILE */

  41.         AT_24c02_int();
  42.         for(i=0;i<BufferSize;i++)
  43.         {
  44.                 AT_24c02_write_data(data_addr++,WriteBuffer[i]);
  45.                 HAL_Delay(10);//写完一个字节的数据要记得延时10ms左右,否则会写错
  46.         }
  47.         HAL_Delay(10);
  48.         data_addr = 0x01;
  49.         for(i=0;i<BufferSize;i++)
  50.         {
  51.                 ReadBuffer[i] = AT_24c02_read_data(data_addr++);
  52.                 //HAL_Delay(10);
  53.         }

  54.         /* 测试输出 */
  55.         for(i=0;i<BufferSize; i++)
  56.         {
  57.                 printf("0x%02X\n ",ReadBuffer[i]);
  58.                 //HAL_Delay(1);
  59.         }



  60.   while(1)
  61.   {

  62.     /* USER CODE BEGIN 3 */
  63.   }
  64.   /* USER CODE END 3 */
  65. }
复制代码

        24C02.c
  1. void AT_24c02_int(void)
  2. {
  3.    IIC_Init();
  4. }
  5. //data_addr 字节地址
  6. //data      数据
  7. void AT_24c02_write_data(uint8_t data_addr,uint8_t data)
  8. {
  9.    IIC_Start();
  10.          IIC_Send_Byte(0xa0);
  11.         IIC_Wait_Ack();
  12.          IIC_Send_Byte(data_addr);
  13.          IIC_Wait_Ack();
  14.          IIC_Send_Byte(data);
  15.          IIC_Wait_Ack();
  16.          IIC_Stop();
  17. }
  18. uint8_t AT_24c02_read_data(uint8_t data_addr)
  19. {
  20.   uint8_t data=0;
  21.         IIC_Start();
  22.         IIC_Send_Byte(0xa0);
  23.         IIC_Wait_Ack();
  24.         IIC_Send_Byte(data_addr);
  25.   IIC_Wait_Ack();
  26.         IIC_Start();
  27.         IIC_Send_Byte(0xa1);
  28.         IIC_Wait_Ack();
  29.         data = IIC_Read_Byte();
  30.         IIC_NAck();
  31.         IIC_Stop();
  32.         return data;
  33. }
复制代码

作者:jxjajl

收藏 评论0 发布时间:2022-12-31 18:58

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版