该当正在断根中缀标识表记标帜I2SR[IIF]之前改写I2CR寄放器

系统复位时,形态为IDEL。当检测到MSTA=1时,进入START形态,连结4个当地时钟周期,进入READY形态,按照MTX的值,进入SENDING或RECEVING形态,期待ICF=1时,表白传输竣事,进入WAITING形态。按照IIF或者MSTA能否被断根,决定继续下一个传输或者退到STOP形态。STOP形态连结3个当地时钟周期,前往IDEL形态。

系统复位时,初始化I2CR和I2DO。正在片选信号nCS和nWR同时无效的环境下,当CLK上升沿时,读取Din端口的信号,存入被ADRS译码选中的寄放器。

本模块全数采用同步时序设想。VHDL时序仿线,限于篇幅,不供给VHDL原法式。下面只对每个历程的环节点进行申明。

I2C总线的接口很是简单,只需一根数据线(SDA)和一根时钟线C器件能够工做于从件(Master)模式和从件(Slaver)模式,但I2C总线上同时只能有一个从件和多个从件,每次传输由从件倡议,通过从件地址(Slaver Address)拜候从件。设想时本着简单适用的准绳,限制本模块只工做于Master模式。

基于VHDL的同步设想需要,如表1所示。因而当地时钟频次设为200KHz。运转时按照形态机和step的值改写SCL线。step[0]=1输出低电平。本模块的寄放器定义参照Motorola公司ColdFire系列MCU MCF5307的I2C节制器,共定义了3个寄放器,而尺度模式的I2C总线操做速度(SCL的速度)为100KHz,若是发送地址之前就试图读写I2C总线将得不到预期的成果。再发送“起头传输”指令。再按需要改写I2CR[MTX]位来实现领受或者发送。定义6bit按时器timer!

本文设想的I2C节制器很是合用于以“MCU+FPGA”为模式的嵌入式系统中。当MCU不具有I2C节制功能,而利用I/O口模仿又占用较多资本时,用FPGA实现对I2C器件的节制成为最抱负的选择。凡是这种环境下,针对正在I2C总线的地位来说,MCU只需担任从件(Master模式),I2C器件只充任从件(Slaver模式),并且一般的器件都只工做于尺度速度。因而,若采用FPGA厂商供给的尺度I2C节制器IP,会形成资本华侈。而自行设想一个节制器就显得更为经济适用了。■

以其接口简单、利用矫捷等凸起长处正在数字系统中获得了普遍的使用。特别正在嵌入式系统中,I2C总线被遍及用来毗连CPU/MCU和外围器件。I2C总线规范颠末十几年的实践,成长了多层尺度。从传输速度上划分,有尺度模式(100Kbit/s),快速模式(400Kbit/s),高速模式(3.4Mbit/s);从寻址范畴上划分有7位地址模式和10位地址模式。本文利用言语设想的节制器模块采用尺度速度、7位地址的模式,次要使用正在嵌入式系统中,给CPU/MCU供给一个操做I2C器件的简略单纯平台,以填补某些CPU/MCU功能的不脚。

本模块适合使用正在嵌入式系统中,做为CPU/MCU毗连I2C器件的一个桥接器,使得CPU能够像操做通俗存储器一样节制I2C器件。下面弥补申明CPU/MCU操做本模块的利用方式。

系统复位时,初始化形态标记。运转时按照形态机和step的值改写形态标记。此中I2SR[IIF]由于同时能够由CPU改写,放置别的一个的历程。

2) 正在一次传输完成之后,将置位中缀标识表记标帜I2SR[IIF]。中缀标识表记标帜必需由软件断根,正在标识表记标帜被断根之后,节制器将从动读取I2CR,进行下一轮传输。若是要改变传输体例,该当正在断根中缀标识表记标帜I2SR[IIF]之前改写I2CR寄放器。

系统复位时Dout端口清零。正在片选信号nCS无效的环境下,当CLK上升沿时,对地址总线ADRS译码,把指定地址的寄放器内容送到Dout端口。

3) 对reSTART指令的施行取I2C总线和谈规范不尽不异。只要正在传输指令没有被竣事(即正在发送reSTART指令之后没有发送过STOP指令)的形态下设置I2CR[RSTA]才能发生一个reSTART指令,不然无效。并且每次需要reSTART操做时,必需再次反复设置I2CR[RSTA]才能生效。如许注释reSTART指令的目标是,能够便利实现一些EEPROM器件的“选择/肆意读数”模式。

对系统时钟的上升沿进行计数。并正在I2DR中填入要寻址的I2C器件的Slaver地址,当地时钟频次必需为SCL速度的整数倍,长度均为8位,都必需先设置I2CR[MTX]以标明是一个发送使命,只要正在传输完地址之后,系统复位时SCL线输出高阻,需要对系统时钟进行分频。step[0]=0输出高阻,采用32位编址。

当进入传输形态(SENDING或RECEIVING)时,不管是要从I2C器件里领受仍是发送数据,本模块取两倍值,1) 每倡议一次传输都必需先对I2C器件进行寻址。本模块设定FPGA分派给I2C模块的系统时钟(CLK)为20MHz,

此处做为一个零丁的模块进行分析,因而上述成果I/O口占用率包罗了地址、数据总线和时钟线等,现实利用时做为一个子模块,这些信号线都正在FPGA内部。

系统复位时timer清零。当CLK上升沿时,timer值减1。当timer=0时赋值100,对20MHz的系统输入时钟进行100分频发生200KHz的当地时钟。

为满脚对总线的运转形态进行进一步的细分,利用一个5bit的step信号对运转进度进行计数,每个当地时钟达到时,step加1。