8.IIC收发模块框图

标题0.整个功能描述

 有两个按键分别控制写eeprom数据和读eeprom数据
 当写按键按下后,往eeprom中写入三个字节的数据
 当读按键按下后,从eeprom读出刚刚写入的三个字节的数据,并且在数码管上显示

标题1.跨时钟处理的相关信号

在这里插入图片描述

1.sys_clk(50M):FPGA的系统时钟
2.sys_rst_n:复位信号,低电平有效
3.write:是控制写iic的按键模块的输出信号,当按键按下的时候,会输出一个高电平(维持一个50M时钟)
4.read:是控制读ii吃的按键模块的输出信号,当按键按下的时候,会输出一个高电平(维持一个50M时钟)
 (这里会涉及跨时钟域的处理因为我们是对iic的读写是通过两个按键进行的,按键模块实在fpga系统时钟50M时钟下进行的,当写按键按下后,会拉高触发信号一个sys_clk(50M)时候的高电平传给IIC收发模块,但是IIC收发模块的系统时钟是i2c_clk(1M),我们这里是用低频信号去采集高频的信号,所以可能出现采集不到的可能,所以需要进行跨时钟域的处理。
 跨时钟处理有好几种:如果是多bit的,用fifo或者ram;如果是单bit的信号,同频不同相,用打一拍的方式;如果是单bit信号,不同频,且是高频到低频的跨时钟处理,那么需要信号保持至少两个周期的低频周期。这里我们就是第三种情况,这里保险起见我们保持4个周期的低频周期,因为sys_clk是50M,而i2c_clk是1M,所以维持4个1M时钟需要在sys_clk时钟下计数200次,此时就需要计数器来控制信号的保持时间)
5.r_write_valid:这是对write信号进行跨时钟域处理后的信号
6.r_cnt_write[7:0]:是跨时钟域处理的时钟计数
7.r_read_valid:同r_write_valid
7:r_cnt_read[7:0]:同r_cnt_write
2.通过iic协议发送的相关信号
 在iic驱动中我们讲解了通过iic时序发送一个byte数据。需要给一个i2c_start信号,同时wr_en为高电平,然后开始一次数据接入,当数据完成之后拉高一个时钟周期i2c_end信号。
 现在要实现的功能是但外部写按键按下的时候,我们连续通过iic发送3个byte的数据,但是注意给iic设备发送数据的时候是有时间间隔的,查找eeprom手册,我们可以看到间隔时间是5ms,因为我们控制时钟是i2c_clk(1M),所以要计数5000个时钟周期,那么就要一个计数器r_cnt_start[10:0]
 那么思路就是:外部写有效信号r_write_valid传入之后,我们的wr_en信号拉高,然后等待5000个时钟周期之后,把i2c_start拉高,然后等待数据发送结束信号i2c_end,当接到i2c_end信号后,把发送数据wr_data[7:0]和写入设备的存粗地址byte_addr[15:0]改变,这里我们都加1即可,然后继续5000个时钟周期之后,把i2c_start拉高,然后等待数据发送结束信号i2c_end,当接到i2c_end信号后,把发送数据wr_data[7:0]和写入设备的地址byte_addr[15:0]改变,这里我们都加1即可,这个时候我们需要一个计数器,计数我们完成了几次发送r_wr_i2c_data_num[7:0],每当i2c_end为高的时候,r_wr_i2c_data_num就自加1,当计数器r_wr_i2c_data_num[7:0]为2的时候,同时接收到数据发送结束信号i2c_end,那么说明此时3个数据都发送完成,把wr_en信号拉低,如果wr_en拉低,那么r_wr_i2c_data_num[7:0]清0,r_cnt_start[10:0]]清0。
 注意:当最后一次发送完成之后,地址byte_addr[15:0]需要恢复到一开始的地址,因为我们设计的模块iic读写的地址是同一个信号,因为写之后,我们会进行数据的读取,那么读取的起始位就应该是写入的起始位置,如果最后最后一次发送完成之后,地址不变,那么我们就会从这个地址读取数据,就无法验证写入数据的正确性了。这里我们也把写入的数据wr_data[7:0]恢复到一开始写入的值,写入的值变不变起始无所谓的
(当我们连续两次按键写按键的时候,起始写的是同样的三个地址,会覆盖之前的数据)
在这里插入图片描述

标题3.通过iic协议读取的相关信号

 这部分和iic协议写入的相关信号差不多
 要做的也是当读按键按下的时候,我们连续从iic设备中读取三个字节的数据,但是也是需要5ms的时间间隔,时间间隔计数器一你刚刚是r_cnt_start
整体思路就是:外部写有效信号r_read_valid传入之后,我们的rd_en信号拉高,然后等待5000个时钟周期之后,把i2c_start拉高,然后等待数据发送结束信号i2c_end,当接到i2c_end信号后,把读取设备的存粗地址byte_addr[15:0]改变,这里我们都加1即可,r_rd_i2c_data_num表示接受到数据的个数,当接到i2c_end信号后,加1。当计数器r_rd_i2c_data_num[7:0]为2的时候,同时接收到数据接受结束信号i2c_end,那么说明此时3个数据接受完成,把rd_en信号拉低,如果rd_en拉低,那么r_rd_i2c_data_num[7:0]清0,r_cnt_start[10:0]]清0。
 此时rd_data[7:0]表示从iic设备读取到的数据。
 注意:当最后一次发送完成之后,地址byte_addr[15:0]也恢复最开始的值
在这里插入图片描述

标题4.与fifo有关的信号

 因为整个系统的任务是把从iic设备读到的数据在数码管上显示,如果我们直接把读到的数据传到数码管显示模块,因为读取的数据变化速度很快,所以我们的眼睛根本反应不过来,数据就更新了,为了能让我们的眼睛看到数码管上更新3个数据,所以我们需要把这三个数据间隔一段时间再发送出去。
所以我们需要一个同步fifo来实现功能,当我们从iic设备读出数据之后,写入fifo中,当我们把数据全部写入fifo之后,再从fifo中读出来到数码管显示模块中
下图是fifo的结构
在这里插入图片描述

所以:
wr_req=i2c_end&rd_en
w_data_num就是usedw信号,标志fifo中数据的个数
当w_data_num的值为3的时候,表示我们所有的数据已经全部写入到fifo中,此时我们把r_fifo_rd_vlid信号拉高
r_fifo_rd_vlid标志该从fifo中输出数据
在这里插入图片描述

信号解释:
w_data_num[7:0]:连在fifo的usedw信号上,表示fifo中有几个数据
r_fifo_rd_vlid:标志该从fifo中输出数据
r_cnt_wait[27:0]:因为上面说了我们从fifo中读取数据的时候需要隔断一段时间,这里我们设定隔断的时间为0.5s,因为时钟时1M,所以计数500000个周期,只有当r_fifo_rd_vlid为高的时候才开始计数
r_fifo_rd_en:练到fifo的rd_req管脚上,当r_fifo_rd_vlid为高,且计数到0.5s时输出一个高电平
r_rd_data_num[7:0]:记录我们从fifo中读出了几个数据
fifo_rd_data[15:0]:fifo读出的数据,会直接接到数码管模块的输入引脚上
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UART、I2C和CAN都是常用的串行通信接口,下面分别介绍它们的开发和调试方法: 1. UART串口接口开发和调试: UART是最常用的串行通信接口之一,常用于连接MCU和其他外设(如PC、手机等)。UART通信原理是通过TX(发送端)和RX(接收端)两根线来传输数据。UART通信的设置包括波特率、数据位、停止位和校验位等。在MCU端,需要使用UART模块进行配置和数据的发送接收。 UART接口开发和调试的步骤如下: (1)确定UART通信参数,包括波特率、数据位、停止位和校验位等; (2)配置MCU的UART模块,包括时钟源、波特率等参数; (3)编写发送和接收函数,实现数据的发送和接收; (4)使用串口调试助手等工具进行调试和验证。 2. I2C接口开发和调试: I2C是一种双线协议,包括SCL(时钟线)和SDA(数据线),用于连接MCU和其他外设(如传感器、存储器等)。I2C通信的设置包括器件地址、时钟频率等。在MCU端,需要使用I2C模块进行配置和数据的发送接收。 I2C接口开发和调试的步骤如下: (1)确定I2C通信参数,包括器件地址、时钟频率等; (2)配置MCU的I2C模块,包括时钟源、时钟频率等参数; (3)编写发送和接收函数,实现数据的发送和接收; (4)使用I2C总线分析仪等工具进行调试和验证。 3. CAN接口开发和调试: CAN是一种基于差分传输的串行通信协议,用于连接MCU和其他外设(如汽车电子控制单元等)。CAN通信的设置包括波特率、帧格式、过滤器等。在MCU端,需要使用CAN模块进行配置和数据的发送接收。 CAN接口开发和调试的步骤如下: (1)确定CAN通信参数,包括波特率、帧格式、过滤器等; (2)配置MCU的CAN模块,包括时钟源、波特率等参数; (3)编写发送和接收函数,实现数据的发送和接收; (4)使用CAN分析仪等工具进行调试和验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值