lattice LFE3-17EA 调试记录
通过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 调试记录相关推荐
- ROS上同时预览depth,IR,RGB 调试记录
ROS上同时预览depth,IR,RGB 调试记录 用rviz同时显示RGB,IR,DEPTH(验证设备:astraprosm,canglong2,deeyea) 1.编译libuvc库 cd lib ...
- ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值——bug调试记录
ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值--bug调试记录 目录 输出结果 1.增加XGBR算法 ...
- [Deepin - Pycharm调试记录] Pyinstaller索引系统库问题
Deepin - Pycharm调试记录 - Pyinstaller索引不到系统库 现象 在Pycharm的Terminal中执行Pyinstaller指令时候遇到如下报错提示 OSError: Py ...
- RAISR-master:google图像新压缩技术RAISR的测试代码调试记录(Python实现,没接触过python的小白,内含pip install解决方案)
RAISR-master:google图像新压缩技术RAISR的测试代码调试记录(Python实现,没接触过python的小白,内含pip install解决方案) 参考文章: (1)RAISR-ma ...
- SX1278 FSK 调试记录
SX1278 FSK 调试记录 先挖个sx1278 FSK的坑慢慢填 手中有两个SX1278模组 是安信可的产品 采用主从模式 SPI访问 MCU是STM32F107 数据格式 说明收据接收的第一步就 ...
- 松下MINAS-A6伺服电机调试记录
松下MINAS-A6伺服电机调试记录 因项目需求,进行松下MINAS-A6伺服电机调试 文章目录 松下MINAS-A6伺服电机调试记录 概述 一.手册数据 二.设备使用 1.驱动器及电机连接 2.设备 ...
- Xilinx AXI Crossbar相关调试记录
Xilinx AXI Crossbar相关调试记录 本文记录在使用Xilinx AXI Crossbar IPcore现象 ** AXI Crossbar IPcore设置如下** 使用AXI Cro ...
- android pppd参数介绍,android 3G pppd 调试记录
android 3G pppd 调试记录. 1. JAVA 部分 android/development/data/etc/apns-conf_sdk.xml ---> system/e ...
- RV1126 调试记录
RV1126 调试记录 ######################################################################################## ...
- ADF4350调试记录及频点锁定
ADF4350调试记录及频点锁定 简介 宽带频率合成器,集成VCO 控制时序 调试记录 无法锁定 最开始,一直无法锁定,参考的官方例子程序,硬件外围电路也排查了好几遍,环路滤波带宽等设定,硬件软件来回 ...
最新文章
- SAP MM 带有Return标记的STO,不能创建内向交货单?
- MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)
- Markdown使用文档
- 选择排序——一般选择排序,堆排序
- pct_change()
- 西安电子科技大学第16届程序设计竞赛G题
- React 重温之 组件生命周期
- 游三大界后感(付照片)
- 阿里云和中移物联网M5311的MQTT通讯
- 基于HTML5的WebGL结合Box2DJS物理应用 1
- UVA-1635 数学
- php 获取某周的最后一天,PHP获取本周首先天和最后一天
- 典型计算机控制系统硬件组成框图,计算机控制技术重要.docx
- 史陶比尔机器人的 LLI (Low Level Interface)
- 事物的开始和结束命令分别是什么_5. 详解Redis中的事务
- 在egret中自制帧动画
- 基于数据结构的超市会员管理系统
- R语言符号秩检验及其应用
- 语义分割-建筑物提取数据集
- 升级 phpStudy 中 MySQL 版本