Lattice Mico8通过RD1046写i2c master读写操作

2024-01-13 04:58

本文主要是介绍Lattice Mico8通过RD1046写i2c master读写操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里我只放代码,在Diamond里添加RD1046里面的Verlag代码,通过线来连接(slave_passthru),具体代码如下:

在Diamond中需要添加:

wire i2c0clk,i2c0rst,i2c0slv_strb,i2c0slv_cyc,i2c0slv_ack,i2c0slv_we,i2c0intr_active_high;
wire [7:0] i2c0slv_master_data,i2c0slv_slave_data;
wire [31:0] i2c0slv_adr;lm8_sys lm8_sys_inst
(.slave_passthru_i2c0clk(i2c0clk) 
, .slave_passthru_i2c0rst(i2c0rst)  
, .slave_passthru_i2c0slv_adr(i2c0slv_adr) 
, .slave_passthru_i2c0slv_master_data(i2c0slv_master_data) 
, .slave_passthru_i2c0slv_slave_data(i2c0slv_slave_data) 
, .slave_passthru_i2c0slv_strb(i2c0slv_strb) 
, .slave_passthru_i2c0slv_cyc(i2c0slv_cyc) 
, .slave_passthru_i2c0slv_ack(i2c0slv_ack) 
, .slave_passthru_i2c0slv_err() 
, .slave_passthru_i2c0slv_rty()  
, .slave_passthru_i2c0slv_sel() 
, .slave_passthru_i2c0slv_we(i2c0slv_we) 
, .slave_passthru_i2c0slv_bte()  
, .slave_passthru_i2c0slv_cti()  
, .slave_passthru_i2c0slv_lock() 
, .slave_passthru_i2c0intr_active_high(i2c0intr_active_high) 
);i2c_master_wb_top i2c_master_inst(.wb_clk_i(i2c0clk), .wb_rst_i(i2c0rst), .arst_i(n_reset_27_domain), .wb_adr_i(i2c0slv_adr[2:0]), .wb_dat_i(i2c0slv_master_data), .wb_dat_o(i2c0slv_slave_data),.wb_we_i(i2c0slv_we), .wb_stb_i(i2c0slv_strb), .wb_cyc_i(i2c0slv_cyc), .wb_ack_o(i2c0slv_ack), .wb_inta_o(i2c0intr_active_high),.scl(i2c_scl), .sda(i2c_sda)
);

然后转回LMS中,这里我根据文档来写的一个函数,是可用来做i2c读写:

void WriteMasterI2c(MicoPassthruCtx_t *ctx, unsigned char address, unsigned char reg8H, unsigned char reg8L, unsigned char *data,unsigned char len){unsigned char ret = 0xff;char  i;unsigned char add = address + 0x00;//7位地址+读写位凑8位(写)REG_WRITE(ctx->base, TXR, add);//设置TXR寄存器,写从设备地址REG_WRITE(ctx->base, CR, 0x90);//发送地址REG_READ(ctx->base, SR, ret);//读取SR状态寄存器//取SR[1]是否为1,为1则进行下去while((ret>>1)&0x1){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}ret = 0xff; //清零REG_WRITE(ctx->base, TXR, reg8H);//设置TXR寄存器,写从设备的寄存器REG_WRITE(ctx->base, CR, 0x10);//发送寄存器while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}ret = 0xff; //清零REG_WRITE(ctx->base, TXR, reg8L);//设置TXR寄存器,写从设备的寄存器REG_WRITE(ctx->base, CR, 0x10);//发送寄存器while((ret>>1)&0x1){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}for(i = 0 ; i < len-1 ; i++){ret = 0xff; //清零REG_WRITE(ctx->base, TXR, data[i]);//设置TXR寄存器,写从设备的数据REG_WRITE(ctx->base, CR, 0x10);//发送数据while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}}ret = 0xff; //清零REG_WRITE(ctx->base, TXR, (data[len-1]));//用数据的最后一个字节设置TXRREG_WRITE(ctx->base, CR, 0x50);//以使WRITE能够发送数据的最后一个字节,然后发出STOP命令while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}return ;
}void ReadMasterI2c(MicoPassthruCtx_t *ctx, unsigned char address, unsigned char reg8H, unsigned char reg8L, unsigned char *data, unsigned char len){unsigned char ret = 0xff;//char data[4];unsigned char  i;unsigned char add = address + 0x00;//7位地址+读写位凑8位(写)REG_WRITE(ctx->base, TXR, add);//设置TXR寄存器,写从设备地址REG_WRITE(ctx->base, CR, 0x90);//发送地址//取SR[1]是否为1,为1则进行下去while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}ret = 0xff; //清零REG_WRITE(ctx->base, TXR, reg8H);//设置TXR寄存器,写从设备的寄存器REG_WRITE(ctx->base, CR, 0x10);//发送寄存器while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}ret = 0xff; //清零REG_WRITE(ctx->base, TXR, reg8L);//设置TXR寄存器,写从设备的寄存器REG_WRITE(ctx->base, CR, 0x10);//发送寄存器while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}ret = 0xff; //清零add = address + 0x01;//7位地址+读写位凑8位(读)REG_WRITE(ctx->base, TXR, add);//设置TXR寄存器,写从设备地址REG_WRITE(ctx->base, CR, 0x90);//发送地址while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}for(i = 0 ; i < len-1; i++){ret = 0xff; //清零REG_WRITE(ctx->base, CR, 0x20);//发出ACK命令。这样可以从从设备读取数据while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}REG_READ(ctx->base, RXR, data[i]);//读取接收寄存器的数据}ret = 0xff; //清零REG_WRITE(ctx->base, CR, 0x28);while(((ret>>1)&0x1)){REG_READ(ctx->base, SR, ret);//读取SR状态寄存器}REG_READ(ctx->base, RXR, data[len-1]);//这将读取数据的最后一个字节,然后发出NACKreturn ;
}

不过这个仅仅是可以用的阶段,但想更好还需要各位大佬去优化,已经仿真过亲测可用。

这篇关于Lattice Mico8通过RD1046写i2c master读写操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600311

相关文章

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示$str = $_GET["name"]; //接受URL来的get形式的name传参echo "<h2 align=center>欢迎用户".$str."</h2>";//在网页输出,并不是echo执行的,而是echo把HTML代码发送到浏览器,浏览器对发送的H

Dungeon Master -uva

一个简答的三维BFS遍历,我从中领悟到了惨痛的教训,关于栈的溢出!!! 不多说了。。郁闷 #include<stdio.h>#include<string.h>#include<stdlib.h>#define MAX_SIZE 50 + 10int Dung[MAX_SIZE][MAX_SIZE][MAX_SIZE];int time[MAX_SIZE][MAX_SIZE][M

基于 rt-thread的I2C操作EEPROM(AT24C02)

一、AT24C02 The AT24C01A/02/04/08A/16A provides 1024/2048/4096/8192/16384 bits of serial electrically erasable and programmable read-only memory (EEPROM) organized as 128/256/512/1024/2048 words of 8 b

I2C总线协议(AT24C02C)

本文章是基于TQ2440开发板上的AT24C02C 一, I2C简介       IIC即Inter-Integrated Circut(集成电路总线),有飞利浦在八十年代实际出来. I2C是一种多向控制总线,就是同一个总线下可以连接多个芯片,同时每个芯片都可以作为实时数据传输的控制源. 二. 硬件结构       I2C串行总线一般有两根信号线,一根是双向的数据总线SDA, 一根是

【spark 读写数据】数据源的读写操作

通用的 Load/Save 函数 在最简单的方式下,默认的数据源(parquet 除非另外配置通过spark.sql.sources.default)将会用于所有的操作。 Parquet 是一个列式存储格式的文件,被许多其他数据处理系统所支持。Spark SQL 支持对 Parquet 文件的读写还可以自动的保存源数据的模式 val usersDF = spark.read.load("e

petalinux i2c的配置

petalinux i2c配置 1.硬件平台配置 下图是我这边的一个硬件测试平台,仅供参考 2.内核配置 1.打开petalinux工程路径 1.cd <plnx-proj-root> 2.petalinux-config -c kernel 3.找到Xilinx I2C Controller Device Drivers -> I2C support -> i2C Hardware

STM32—I2C的基本时序,MU6050的ID读取

目录 前言 一、I2C基本时序的书写 二、I2C基本时序的代码 1.引脚的初始化 2.起始时序 3.停止时序 4.发送一个字节 5.接收一个字节 6.发送一个应答 7.接收一个应答 三.MU6050的应答 1.先验证下应答功能: 2.读取ID 总结 前言 环境: 芯片:STM32F103C8T6 Keil:V5.24.2.0 模块:MU6050

idea向git上推送被拒绝 push to master was rejected

当你在尝试将代码推送到远程仓库(如 GitHub、GitLab 或 Bitbucket)的 origin/master 分支时遇到“Pushrejected: Push to origin/master was rejected”这样的错误,这意味着远程仓库对你的推送请求进行了一些限制或者你的本地仓库与远程仓库的状态不一致。 1. 远程分支保护 许多仓库(尤其是主分支,如 master

每天分享一个FPGA开源代码(3)- I2C

​ I2C(Inter-Integrated Circuit)是一种两线式串行总线。   ​   一、主要特点 1. 简单性:只使用两根线,即串行数据线(SDA)和串行时钟线(SCL),减少了硬件连接的复杂性。 2. 多设备连接:可以连接多个具有 I2C 接口的设备到同一总线,每个设备都有唯一的地址,通过地址来区分和通信。 3. 双向通信:SDA 线允许数据在主设备和从设备之间双