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

相关文章

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

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