《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > FPGA教學——FPGA實現IIC協議

FPGA教學——FPGA實現IIC協議

2022-08-23
作者: 電擊小子
來源: 電子技術應用專欄作家 FPGA之旅
關鍵詞: FPGA IIC協議

  一. 簡介

  這是FPGA之旅設計的第五例啦!今天給大家帶來的是IIC通信,IIC協議應用非常廣泛,例如與MPU6050進行通信,配置OV5640攝像頭、驅動OLED屏幕等等,都需要使用到IIC協議,所以掌握它是非常必要的,廢話不多說,接著往下看。文末獲取完整代碼。

  二. IIC簡介

  IIC協議分為主機和從機,所有的請求都是由主機發出,從機進行響應,從機是沒有辦法對主機進行讀或寫的。IIC協議共有兩根線,數據線SDA和時鐘線SCL,兩根線就可以完成所有的通信請求,簡直是太給力了。

  三. IIC協議

  終于到了IIC協議的部分。IIC協議簡單來說,共有五種狀態,這五種狀態的有序組合就組成了完整的IIC通信,學習IIC協議,就是學習這五種狀態。

  空閑態:  SCL 和 SDA 都為高電平,不進行通信的時候。

  起始態:在SCL為高電平的時候,將SDA拉低,主機通知從機,開始進行通信。

  數據傳輸態:數據傳輸態,又可以分為讀和寫兩個部分,過程都是一樣的,就合在一起了,都是在SCL為低電平的時候,SDA將數據發送,在SCL為高電平的時候,將數據接收。

  (非)應答態:數據傳輸態完成后,必須接一個應答態或者非應答態,為了確定對方接收到了數據。在SCL為高電平的時候,檢測到SDA為低電平,則為應答,否則為非應答。

  停止態:一次數據傳輸完成,由主機發起,在SCL為高電平的時候,SDA由低電平變成高電平。

  了解了這五種狀態后,接下來就要學習如何使用這五種狀態來進行讀寫操作了。

  (一)  IIC寫操作

  下面就是一個完整的寫操作,共包含三次數據傳輸態,第一次發送的是從機地址 + 0,第二次發送的是寄存器的地址,第三次寫的是數據,寫入寄存器中的數據。從機地址一般為7bit,與另外一bit共同組成8bit,0表示寫,1表示讀。

  微信截圖_20220823161653.png  

  (二)IIC讀操作

  讀操作要比寫操作復雜一點,需要的狀態多一些。一共有五個數據傳輸態,狀態圖如下了。

  微信截圖_20220823161712.png

  上面的流程圖都是對從機的地址為7位以及從機的寄存器地址為8位的操作。

  四. Verilog代碼實現

  有了上面的各個狀態中,SDA和SCL的變換關系,以及讀寫的序列,就可以很方便的來寫程序啦。

  1. 首先,當然離不開狀態機,根據上面敘述的五種狀態,編寫狀態機,狀態機中,將數據傳輸態分成了讀和寫兩種狀態。有了各個狀態,操作SDA和SCL兩根線不是易如反掌嘛!

  /*IIC 狀態*/

  localparam IIC_IDLE       =   6'b000_001;  /*空閑態*/

  localparam IIC_START      =   6'b000_010;  /*起始態*/

  localparam IIC_WRDATA     =   6'b000_100;  /*寫數據態*/

  localparam IIC_RDDATA     =   6'b001_000;  /*讀數據態*/

  localparam IIC_ACK        =   6'b010_000;  /*應答態*/

  localparam IIC_STOP       =   6'b100_000;  /*停止態*/

  2. 狀態機的跳轉條件如下,跳轉條件和上面敘述的一樣。單獨看這個有點難懂,有些變量不明白其具體含義,可以結和仿真圖形和完整代碼進行理解。

  /*狀態機*/

  always @(*)

  begin

  case(state)

  IIC_IDLE:

  if(IICWriteReq == 1'b1 || IICReadReq == 1'b1)

  next_state <= IIC_START;

  else

  next_state <= IIC_IDLE;

  IIC_START:

  if(IICCnt == (IIC_Pre * 'd2))

  next_state <= IIC_WRDATA;

  else

  next_state <= IIC_START;

  IIC_WRDATA:

  if(IICBitCnt == 'd8 && IICCnt == IIC_Pre /4 && iicCLK == 1'b0)

  next_state <= IIC_ACK;

  else

  next_state <= IIC_WRDATA;

  IIC_RDDATA:

  if(IICBitCnt == 'd8 && IICCnt == IIC_Pre /4 && iicCLK == 1'b0)

  next_state <= IIC_ACK;

  else

  next_state <= IIC_RDDATA;

  IIC_ACK:

  if(IICACKStopCnt == 'd1 && IICCnt == IIC_Pre /4 && iicCLK == 1'b0)

  if(IICSendBytes == 'd3)

  if(IICWriteReq == 1'b1)         /*三個字節發送完成,進入停止態*/

  next_state <= IIC_STOP;

  else

  next_state <= IIC_RDDATA;

  else if(IICSendBytes == 'd2 && IICReadReq == 1'b1)

  next_state <= IIC_START;

  else if(IICSendBytes == 'd4)

  next_state <= IIC_STOP;

  else

  next_state <= IIC_WRDATA;

  else

  next_state <= IIC_ACK;

  IIC_STOP:

  if(IICACKStopCnt == 'd1 && IICCnt == IIC_Pre/4 && iicCLK == 1'b1)

  next_state <= IIC_IDLE;

  else

  next_state <= IIC_STOP;

  default:  next_state <= IIC_IDLE;

  endcase

  end

  各個部分實現的詳細代碼,就不列舉出來啦,代碼總計280多行,也不算多。通過本IIC模塊,可以驅動OV5640攝像頭,MPU6050模塊和0.96寸OLED屏幕等等,后續會基于此模塊,來驅動這些外設。

  五. testbeach編寫

  還是按照流程走,編寫完模塊后,進行一下仿真,還真有錯誤,幸虧仿真了,哈哈哈。

  `timescale 1ns/1ps

  module testbench();

  reg  clk;

  reg  rst;

  wire  SDA;

  wire  SCL;

  reg IICWriteReq;

  reg IICReadReq;

  wire IICWriteDone;

  wire IICReadDone;

  always # 50 clk = ~clk;

  initial begin

  clk = 1'b1;

  rst = 1'b1;

  IICWriteReq = 1'b0;

  IICReadReq = 1'b1;

  #100   /*手動復位*/

  rst = 1'b0;

  #100

  rst = 1'b1;

  end

  always@(posedge clk)

  if(IICReadDone == 1'b1)   /*讀完成后,readReq為0,只進行一次讀寫操作*/

  IICReadReq <= 1'b0;

  else

  IICReadReq <= IICReadReq;

  IIC_Driver  IIC_DriverHP(

  .sys_clk            (clk),           /*系統時鐘*/

  .rst_n              (rst),             /*系統復位*/

  .IICSCL             (SCL),            /*IIC 時鐘輸出*/

  .IICSDA             (SDA),             /*IIC 數據線*/

  .IICSlave           ('h1234),

  .IICWriteReq        (IICWriteReq),       /*IIC寫寄存器請求*/

  .IICWriteDone        (IICWriteDone),      /*IIC寫寄存器完成*/

  .IICWriteData        ('h5a), /*IIC發送數據 8bit的從機地址 + 8bit的寄存器地址 + 8bit的數據(讀忽略,后默認為0)*/

  .IICReadReq         (IICReadReq),        /*IIC讀寄存器請求*/

  .IICReadDone        (IICReadDone),       /*IIC讀寄存器完成*/

  .IICReadData        ()/*IIC讀取數據*/

  );

  endmodule

  需要完整代碼的可以關注微信公眾號 FPGA之旅 回復 :FPGA之旅設計99例之第五例


更多信息可以來這里獲取==>>電子技術應用-AET<<

微信圖片_20210517164139.jpg


微信截圖_20220708161426.png

電子技術應用專欄作家  FPGA之旅

原文鏈接:https://mp.weixin.qq.com/s/3qwZRqjHEZzj4V8uMo0T4g

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲国产高清高潮精品美女| 91久久一区二区| 亚洲黄色免费电影| 在线免费观看日韩欧美| 欧美+亚洲+精品+三区| 亚洲精品国产精品国自产在线 | 亚洲精选国产| 国产精品高清免费在线观看| 欧美在线日韩精品| 亚洲国产三级网| 久久高清一区| 一本色道久久综合亚洲精品高清 | 欧美一区二区网站| 亚洲激情午夜| 国产精品乱子久久久久| 久久一区亚洲| 亚洲午夜三级在线| 久久精品电影| 一本色道久久综合狠狠躁篇怎么玩| 最新日韩精品| 99re6热在线精品视频播放速度| 国产精品羞羞答答| 欧美激情精品久久久久久黑人| 亚洲欧美日韩电影| 亚洲黄色在线看| 亚洲精品看片| 一区二区三区回区在观看免费视频| 中文精品视频| 一区二区视频欧美| 欧美日韩在线另类| 久久久久久亚洲精品不卡4k岛国| 亚洲精品乱码久久久久久按摩观 | 女同性一区二区三区人了人一 | 欧美精品日日鲁夜夜添| 欧美在线欧美在线| 久久天堂av综合合色| 欧美国产日韩精品免费观看| 欧美日韩免费观看一区二区三区 | 亚洲女同在线| 亚洲欧洲一区二区三区在线观看| 亚洲人久久久| 亚洲视频免费观看| 午夜伦理片一区| 亚洲小说春色综合另类电影| 亚洲激情综合| 一本久久综合| 性欧美video另类hd性玩具| 亚洲精品视频啊美女在线直播| 黄色一区二区三区| 国产精品一区二区三区久久| 欧美日韩一区二区三区视频| 国产精品美女久久久久av超清| 国产亚洲精品久久久久婷婷瑜伽| 欧美网站在线| 欧美日韩成人| 欧美成人一区在线| 久久在线免费观看视频| 欧美精品入口| 国产欧美一区二区精品仙草咪 | 欧美中文字幕精品| 欧美第十八页| 国产精品影视天天线| 亚洲国产二区| 亚洲成色精品| 亚洲毛片视频| 欧美伊人影院| 亚洲一区在线免费| 亚洲午夜极品| 久久久久久久欧美精品| 欧美日韩日本国产亚洲在线| 国产午夜亚洲精品不卡| 国产欧美日韩亚洲| 亚洲片区在线| 午夜性色一区二区三区免费视频| 亚洲剧情一区二区| 日韩视频免费| 亚洲精品美女在线观看播放| 亚洲欧美国产高清| 女同一区二区| 国产尤物精品| 激情成人av| 亚洲午夜电影在线观看| 亚洲经典一区| 亚洲精品婷婷| 久久精品30| 可以看av的网站久久看| 美女成人午夜| 欧美激情国产日韩精品一区18| 国产精品毛片a∨一区二区三区| 在线日韩欧美视频| 午夜精品久久久久久久99水蜜桃| 在线亚洲观看| 亚洲欧美日韩中文在线制服| 亚洲综合社区| 欧美精品1区2区3区| 激情自拍一区| 性欧美超级视频| 亚洲欧美在线高清| 欧美三级电影大全| 亚洲精品乱码视频| 亚洲精品日韩在线| 噜噜噜噜噜久久久久久91| 国产日韩欧美在线| 亚洲欧美日产图| 亚洲欧美激情在线视频| 欧美午夜a级限制福利片| 91久久视频| 亚洲美洲欧洲综合国产一区| 久久亚洲不卡| 国产在线国偷精品产拍免费yy| 亚洲免费在线播放| 亚洲高清在线| 久久国产婷婷国产香蕉| 国产精品永久免费| 亚洲字幕在线观看| 亚洲欧美日本日韩| 国产精品久久影院| 宅男噜噜噜66国产日韩在线观看| 午夜精品999| 午夜精品久久久久久久| 国产精品av久久久久久麻豆网| 国产精品永久入口久久久| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲电影视频在线| 久久久在线视频| 国产一区日韩欧美| 欧美专区第一页| 久久综合九色综合网站| 在线播放一区| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品热久久久久夜色精品三区| 这里只有精品丝袜| 亚洲一区二区在| 国产精品久久综合| 午夜久久一区| 久久久99精品免费观看不卡| 欧美理论电影在线播放| 国产精品五月天| 午夜精品国产更新| 久久激情综合| 精品成人在线观看| 亚洲精品无人区| 欧美日韩精品一区二区在线播放| 99av国产精品欲麻豆| 午夜精品久久久久久久男人的天堂| 国产精品资源在线观看| 欧美在线www| 久久久久久久综合狠狠综合| 国产女优一区| 小黄鸭精品密入口导航| 久久亚洲高清| 亚洲精品网址在线观看| 亚洲欧美一区二区精品久久久| 国产视频观看一区| 亚洲国产另类精品专区| 欧美激情一区二区久久久| 亚洲精品小视频在线观看| 亚洲欧美精品一区| 国产一区二区三区在线观看视频 | 国产精品久久久久久超碰| 性亚洲最疯狂xxxx高清| 免费在线看一区| 日韩网站在线| 亚洲欧美美女| 亚洲第一精品夜夜躁人人躁 | 国产精品久久久久久久免费软件 | 午夜精品视频网站| 欧美高潮视频| 亚洲欧美第一页| 欧美韩日精品| 亚洲中无吗在线| 欧美成人免费小视频| 亚洲小少妇裸体bbw| 欧美aa国产视频| 亚洲综合国产激情另类一区| 乱人伦精品视频在线观看| 一区二区欧美激情| 久久这里只精品最新地址| 99综合在线| 久久亚洲精品欧美| 国产精品99久久久久久久久久久久 | 亚洲日本va午夜在线影院| 先锋影音一区二区三区| 欧美日韩和欧美的一区二区| 亚洲影音一区| 欧美激情视频一区二区三区免费 | 亚洲天堂av在线免费| 激情丁香综合| 亚洲免费伊人电影在线观看av| 在线观看欧美黄色| 欧美一级一区| 国产精品一区二区三区观看| 亚洲激情视频网站| 国产欧美在线观看| 这里只有精品视频| 一区二区在线看| 欧美一级视频| 99re6这里只有精品视频在线观看| 久久久久国产免费免费| 99re热精品|