通过IIC控制EP936E

IIC读写代码

//
//                                                I2c Byte Write Mode
//          _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   
// SCL:  __| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_
//       ___   ___ ___ ___ ___ ___ ___ ___         ___ ___ ___ ___ ___ ___ ___ ___     ___ ___ ___ ___ ___ ___ ___ ___       ______________
// SDA:     |_|___|___|___|___|___|___|___|_______|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|_____|
//              0   1   1   1  S3  S2  S1  W=0 ACK A7  A6  A5  A4  A3  A2  A1  A0  ACK D7  D6  D5  D4  D3  D2  D1  D0  ACK STOP
//      [START]                                                                                                           [STOP]
//            |<---SLAVE    ADDRESS---------->|   |<-----REGISTER ADDRESS--------->|  |<------------DATA------------->|
//

//                                               I2c Byte Read Mode
//          _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _
// SCL:  __| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_
//       ___   ___ ___ ___ ___ ___ ___ ___         ___ ___ ___ ___ ___ ___ ___ ___     _   ___ ___ ___ ___ ___ ___ ___ ___     ___ ___ ___ ___ ___ ___ ___ ___ ___   ______
// SDA:     |_|___|___|___|___|___|___|___|_______|___|___|___|___|___|___|___|___|___| |_|___|___|___|___|___|___|___|   |___|___|___|___|___|___|___|___|___|   |_|
//              0   1   1   1  S3  S2  S1  W=0 ACK A7  A6  A5  A4  A3  A2  A1  A0  ACK     0   1   1   1  S3  S2  S1   R=1 ACK D7  D6  D5  D4  D3  D2  D1  D0  ACK 
//       [START]                                                                     [START]                                                                      [STOP]     
//            |<---SLAVE    ADDRESS------- --->|   |<-----REGISTER ADDRESS--------->|      |<-------SLAVE    ADDRESS------>|   |<------------DATA------------->|
//
//
//
// 
//
// CLK: 50MHz

module iic_com
(
    input CLK,
input RSTn,
 
input [1:0] Start_Sig,             //read or write command
input [7:0] Addr_Sig,              //eeprom words address
input [7:0] Addr_offset,           //Offset Address   
input [7:0] WrData,                //eeprom write data
output [7:0] RdData,               //eeprom read data
output Done_Sig,                   //eeprom read/write finish
 
output SCL,
inout SDA
 
);

parameter FPXS = 12'd500;                //100Khz的时钟分频系数
parameter C1_1= FPXS[11:2];               //C1_1=FPXS/4
parameter C1_2= FPXS[11:1];              // C1_2=FPXS/2
parameter C1_3= FPXS[11:2]+FPXS[11:1];              //C1_3=(FPXS/4)*3
parameter C1_4= FPXS;
parameter C1_5= FPXS+FPXS[11:2];           //C1_3=(FPXS/4)*5                          
 
reg [4:0]i;
reg [4:0]Go;
reg [11:0]C1;
reg [7:0]rData;
reg rSCL;
reg rSDA;
reg isAck;
reg isDone;
reg isOut;
 
assign Done_Sig = isDone;
assign RdData = rData;
assign SCL = rSCL;
assign SDA = isOut ? rSDA : 1'bz;        //SDA数据输出选择

//****************************************// 
//*             I2C读写处理程序            *// 
//****************************************// 
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )  begin
i <= 5'd0;
Go <= 5'd0;
C1 <= 10'd0;
rData <= 8'd0;
rSCL <= 1'b1;
rSDA <= 1'b1;
isAck <= 1'b1;
isDone <= 1'b0;
isOut <= 1'b1;
end
else if( Start_Sig[0] )                     //I2C 数据写
    case( i )
   
   0: //发送IIC开始信号
begin
isOut <= 1;                         //SDA端口输出

if( C1 == 0 ) rSCL <= 1'b1;
else if( C1==C1_4 ) rSCL <= 1'b0;       //SCL由高变低
 
if( C1 == 0 ) rSDA <= 1'b1; 
else if( C1==C1_2 ) rSDA <= 1'b0;        //SDA先由高变低 
 
if( C1==C1_5 -1) begin C1 <= 10'd0; i <= i + 1'b1; end
else C1 <= C1 + 1'b1;
end
 
1: // Write Device Addr       写设备地址
begin rData <= {8'h76}; i <= 5'd8; Go <= i + 1'b1; end         
 
2: // Wirte Word Addr 写寄存器地址
begin rData <= Addr_Sig; i <= 5'd8; Go <= i + 1'b1; end
 
3: // Wirte Offset Address 写页地址
begin rData <= Addr_offset; i <= 5'd8; Go <= i + 1'b1; end

4: // Write Data 写数据
begin rData <= WrData; i <= 5'd8; Go <= i + 1'b1; end
 
5: //发送IIC停止信号
begin
   isOut <= 1'b1;
 
   if( C1 == 0 ) rSCL <= 1'b0;
   else if( C1==C1_1 ) rSCL <= 1'b1;     //SCL先由低变高

if( C1 == 0 ) rSDA <= 1'b0;
else if( C1==C1_3 ) rSDA <= 1'b1;     //SDA由低变高  
 
if( C1==C1_5 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end
else C1 <= C1 + 1'b1; 
end
 
6:
begin isDone <= 1'b1; i <= i + 1'b1; end       //写I2C 结束
 
7: 
begin isDone <= 1'b0; i <= 5'd0; end
 
8,9,10,11,12,13,14,15:                         //发送Device Addr/Word Addr/Write Data
begin
    isOut <= 1'b1;
 rSDA <= rData[15-i];                      //高位先发送
 
 if( C1 == 0 ) rSCL <= 1'b0;
    else if( C1==C1_1 ) rSCL <= 1'b1;         //SCL高电平100个时钟周期,低电平100个时钟周期
 else if( C1==C1_3 ) rSCL <= 1'b0; 
 
 if( C1==C1_4 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end     //产生250Khz的IIC时钟
 else C1 <= C1 + 1'b1;
end
 
16:                                          // waiting for acknowledge
begin
    isOut <= 1'b0;                            //SDA端口改为输入
    if( C1==C1_2 ) isAck <= SDA;             //读取IIC 从设备的应答信号
 
 if( C1 == 0 ) rSCL <= 1'b0;
 else if( C1==C1_1 ) rSCL <= 1'b1;         //SCL高电平100个时钟周期,低电平100个时钟周期
 else if( C1==C1_3 ) rSCL <= 1'b0;
 
 if( C1==C1_4 -1 ) begin  C1 <= 10'd0; i <= i + 1'b1; end    //产生250Khz的IIC时钟
 else C1 <= C1 + 1'b1; 
end
 
16:
if( isAck != 0 ) i <= 5'd0;
else i <= 5'd0; 
// else i <= Go;

endcase

else if( Start_Sig[1] )                     //I2C 数据读
   case( i )

0: // Start
begin
     isOut <= 1;                      //SDA端口输出
     
     if( C1 == 0 ) rSCL <= 1'b1;
  else if( C1==C1_4 ) rSCL <= 1'b0;      //SCL由高变低
 
if( C1 == 0 ) rSDA <= 1'b1; 
else if( C1==C1_2 ) rSDA <= 1'b0;     //SDA先由高变低 
 
if( C1==C1_5 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end
else C1 <= C1 + 1'b1;
end
 
1: // Write Device Addr(设备地址)
begin rData <= 8'h76; i <= 5'd10; Go <= i + 1'b1; end
 
2: // Wirte Word Addr(EEPROM的写地址)
begin rData <= Addr_Sig; i <= 5'd10; Go <= i + 1'b1; end
 
3: // Wirte Offset Address 写页地址
begin rData <= Addr_offset; i <= 5'd10; Go <= i + 1'b1; end

4: // Start again
begin
    isOut <= 1'b1;
     
    if( C1 == 0 ) rSCL <= 1'b0;
 else if( C1==C1_1 ) rSCL <= 1'b1; 
 else if( C1==C1_5 ) rSCL <= 1'b0;
 
    if( C1 == 0 ) rSDA <= 1'b0; 
 else if( C1==C1_1 ) rSDA <= 1'b1;
 else if( C1==C1_3 ) rSDA <= 1'b0;  
 
 if( C1 == 300 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end
 else C1 <= C1 + 1'b1;
end
 
5: // Write Device Addr ( Read )
begin rData <= 8'h77; i <= 5'd10; Go <= i + 1'b1; end

6: // Read Data
begin rData <= 8'd0; i <= 5'd20; Go <= i + 1'b1; end
 
7: // Stop
begin
    isOut <= 1'b1;
    if( C1 == 0 ) rSCL <= 1'b0;
 else if( C1==C1_1 ) rSCL <= 1'b1;

if( C1 == 0 ) rSDA <= 1'b0;
 else if( C1==C1_3 ) rSDA <= 1'b1;
 
 if( C1==C1_5 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end
 else C1 <= C1 + 1'b1; 
end
 
8:                                                       //写I2C 结束
begin isDone <= 1'b1; i <= i + 1'b1; end
 
9: 
begin isDone <= 1'b0; i <= 5'd0; end

10,11,12,13,14,15,16,17:                                  //发送Device Addr(write)/Word Addr/Device Addr(read)
begin
     isOut <= 1'b1;      
  rSDA <= rData[16-i];                                //高位先发送
 
  if( C1 == 0 ) rSCL <= 1'b0;
else if( C1==C1_1 ) rSCL <= 1'b1;                   //SCL高电平100个时钟周期,低电平100个时钟周期
else if( C1==C1_3 ) rSCL <= 1'b0; 
 
if( C1==C1_4 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end   //产生250Khz的IIC时钟
else C1 <= C1 + 1'b1;
end
      
18: // waiting for acknowledge
begin
     isOut <= 1'b0;                                       //SDA端口改为输入
    
  if( C1==C1_2 ) isAck <= SDA;                        //读取IIC 的应答信号
 
if( C1 == 0 ) rSCL <= 1'b0;
else if( C1==C1_1 ) rSCL <= 1'b1;                 //SCL高电平100个时钟周期,低电平100个时钟周期
else if( C1==C1_3 ) rSCL <= 1'b0;
 
if( C1==C1_4 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end     //产生250Khz的IIC时钟
else C1 <= C1 + 1'b1; 
end
 
19:
     if( isAck != 0 ) i <= 5'd0;           // if( isAck != 0 ) i <= 5'd0;
else i <= Go;
 
 
20,21,22,23,24,25,26,27: // Read data
begin
    isOut <= 1'b0;
    if( C1==C1_2 ) rData[26-i] <= SDA;                              //高位先接收
 
 if( C1 == 0 ) rSCL <= 1'b0;
 else if( C1==C1_1 ) rSCL <= 1'b1;                  //SCL高电平100个时钟周期,低电平100个时钟周期
 else if( C1==C1_3 ) rSCL <= 1'b0; 
 
 if( C1==C1_4 -1 ) begin C1 <= 10'd0; i <= i + 1'b1; end     //产生250Khz的IIC时钟
 else C1 <= C1 + 1'b1;
end  
 
28: // no acknowledge
begin
    isOut <= 1'b1;
 
 if( C1 == 0 ) rSCL <= 1'b0;
 else if( C1==C1_1 ) rSCL <= 1'b1;
 else if( C1==C1_3 ) rSCL <= 1'b0;
 
 if( C1==C1_4 -1 ) begin C1 <= 10'd0; i <= Go; end
 else C1 <= C1 + 1'b1; 
end

endcase

endmodule

lattice LFE3-17EA 调试记录相关推荐

  1. ROS上同时预览depth,IR,RGB 调试记录

    ROS上同时预览depth,IR,RGB 调试记录 用rviz同时显示RGB,IR,DEPTH(验证设备:astraprosm,canglong2,deeyea) 1.编译libuvc库 cd lib ...

  2. ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值——bug调试记录

    ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值--bug调试记录 目录 输出结果 1.增加XGBR算法 ...

  3. [Deepin - Pycharm调试记录] Pyinstaller索引系统库问题

    Deepin - Pycharm调试记录 - Pyinstaller索引不到系统库 现象 在Pycharm的Terminal中执行Pyinstaller指令时候遇到如下报错提示 OSError: Py ...

  4. RAISR-master:google图像新压缩技术RAISR的测试代码调试记录(Python实现,没接触过python的小白,内含pip install解决方案)

    RAISR-master:google图像新压缩技术RAISR的测试代码调试记录(Python实现,没接触过python的小白,内含pip install解决方案) 参考文章: (1)RAISR-ma ...

  5. SX1278 FSK 调试记录

    SX1278 FSK 调试记录 先挖个sx1278 FSK的坑慢慢填 手中有两个SX1278模组 是安信可的产品 采用主从模式 SPI访问 MCU是STM32F107 数据格式 说明收据接收的第一步就 ...

  6. 松下MINAS-A6伺服电机调试记录

    松下MINAS-A6伺服电机调试记录 因项目需求,进行松下MINAS-A6伺服电机调试 文章目录 松下MINAS-A6伺服电机调试记录 概述 一.手册数据 二.设备使用 1.驱动器及电机连接 2.设备 ...

  7. Xilinx AXI Crossbar相关调试记录

    Xilinx AXI Crossbar相关调试记录 本文记录在使用Xilinx AXI Crossbar IPcore现象 ** AXI Crossbar IPcore设置如下** 使用AXI Cro ...

  8. android pppd参数介绍,android 3G pppd 调试记录

    android 3G pppd 调试记录. 1.  JAVA 部分 android/development/data/etc/apns-conf_sdk.xml   --->  system/e ...

  9. RV1126 调试记录

    RV1126 调试记录 ######################################################################################## ...

  10. ADF4350调试记录及频点锁定

    ADF4350调试记录及频点锁定 简介 宽带频率合成器,集成VCO 控制时序 调试记录 无法锁定 最开始,一直无法锁定,参考的官方例子程序,硬件外围电路也排查了好几遍,环路滤波带宽等设定,硬件软件来回 ...

最新文章

  1. SAP MM 带有Return标记的STO,不能创建内向交货单?
  2. MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)
  3. Markdown使用文档
  4. 选择排序——一般选择排序,堆排序
  5. pct_change()
  6. 西安电子科技大学第16届程序设计竞赛G题
  7. React 重温之 组件生命周期
  8. 游三大界后感(付照片)
  9. 阿里云和中移物联网M5311的MQTT通讯
  10. 基于HTML5的WebGL结合Box2DJS物理应用 1
  11. UVA-1635 数学
  12. php 获取某周的最后一天,PHP获取本周首先天和最后一天
  13. 典型计算机控制系统硬件组成框图,计算机控制技术重要.docx
  14. 史陶比尔机器人的 LLI (Low Level Interface)
  15. 事物的开始和结束命令分别是什么_5. 详解Redis中的事务
  16. 在egret中自制帧动画
  17. 基于数据结构的超市会员管理系统
  18. R语言符号秩检验及其应用
  19. 语义分割-建筑物提取数据集
  20. 升级 phpStudy 中 MySQL 版本

热门文章

  1. 第三次组织架构变动背后,腾讯AI走向何方?
  2. 从Elasticsearch来看分布式系统架构设计,真是666~
  3. Netty结合Protostuff传输对象案例,单机压测秒级接收35万个对象
  4. 跟我学Springboot开发后端管理系统5:数据库读写分离
  5. fork/join 全面剖析,你可以不用,但是不能不懂!
  6. 面试被问烂的 Spring IOC(求求你别再问了)
  7. 最新的NLP开源神器来了!
  8. 50岁马斯克又恋爱了!27岁金发女友长着芭比娃娃脸
  9. 阮一峰在 GitHub 又一开源力作!
  10. 显卡暴涨,这我万万没想到啊