SOC系统经典IP介绍以及使用方法说明之dw_i2c

这篇具有很好参考价值的文章主要介绍了SOC系统经典IP介绍以及使用方法说明之dw_i2c。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录


第三章 DW_i2c功能及使用流程介绍


文章目录

前言

一、功能介绍

1.1 i2c写操作:

1.1.1 详细flow介绍

1.2 i2c读操作:

1.2.1 详细flow介绍

二、软件流程介绍

2.1 定义WDT中断服务子程序

2.2 定义main函数

三、总结



前言

     按照i2c的协议,i2c的时钟由master方提供,master可以向slave发送数据,也可以向slave请求数据。对应的slave既可以接收来自master发送的数据,也可以响应master请求数据。关于i2c协议,后续我们会单独讲解里面的细节和注意事项,这里我们主要接收使用过程中的一些基本配置flow。


一、功能介绍

       这里简单介绍一下i2c读写过程涉及到flow:

1.1 i2c写操作:

SOC系统经典IP介绍以及使用方法说明之dw_i2c,数字设计,汇编,c语言,人工智能,开发语言,青少年编程,嵌入式硬件,fpga开发

1.1.1 详细flow介绍

step1:首先master发起i2c start,即在sclk高电平拉低sda;

step2:发送slave设备地址,与之通信,这个设备地址按照协议可以是7bit,也可以是10bit,这里介绍最简单的7bit模式。

step3:紧接着发送一个bit的写控制位,表示当前传输为一笔写操作。

step4:然后后续跟着两个byte的数据,这两个byte数据一般用于软件解析命令用,通常情况下收发双方可以利用这两个byte自定义一些私有协议,比如最简单的就是两个纯粹的mem地址0x1000,表示master即将向0x1000地址写数据,因此后续master发送过来的Data,需要软件将其搬运到系统mem 0x1000地址去。当然也可以将这两个byte拆分成多个不同的命令,方便系统灵活运用。

step5:然后是发送过来的真正的payload数据

step6:当master完成数据写传输后,发送stop,即在scl的高电平拉高sda,结束当前传输。

1.2 i2c读操作:

SOC系统经典IP介绍以及使用方法说明之dw_i2c,数字设计,汇编,c语言,人工智能,开发语言,青少年编程,嵌入式硬件,fpga开发

1.2.1 详细flow介绍

step1:首先master发起i2c start,即在sclk高电平拉低sda;

step2:发送slave设备地址,与之通信,这个设备地址按照协议可以是7bit,也可以是10bit,这里介绍最简单的7bit模式。

step3:紧接着发送一个bit的写控制位,表示当前传输为一笔写操作。

step4:然后后续跟着两个byte的数据,这两个byte数据一般用于软件解析命令用,通常情况下收发双方可以利用这两个byte自定义一些私有协议,比如最简单的就是两个纯粹的mem地址0x1000,表示master即将向0x1000地址写数据,因此后续master发送过来的Data,需要软件将其搬运到系统mem 0x1000地址去。当然也可以将这两个byte拆分成多个不同的命令,方便系统灵活运用。

step5:这里master发送了一个re_start操作,即在scl的高电平拉低了sda,而并非发送payload数据,这里其实是一个读的转身,当slave接收到re_start时,会认为master其实想读数据,访问的数据地址体现在2byte信息里。因此,此时软件需要从内存地址里取数据并加载到i2c tx fifo中;

step6:按照协议重新发送设备地址以及R控制bit,这里配合step5供软件解析读过程。

step7:slave会根据软件填写的tx fifo值,把数据发送出去。

step8:当master接收完数据后,发送stop,即在scl的高电平拉高sda,结束当前传输。

二、软件流程介绍

2.1 定义WDT中断服务子程序

中断handler定义:

int dw_i2c_int_handler()
{
   int rdata;
   rdata = REG32(I2C_INTR_STAT);  //read intr status
   //judge which intr bit trigger
   if((rdata & 0x1) == 0x1) //rx_under
     {
       rdata = REG32(I2C_CLR_RX_UNDER); //read clear
     }
   else if((rdata & 0x2) == 0x2) //rx_over
     {
       rdata = REG32(I2C_CLR_RX_OVER); //read clear
     }
   else if((rdata & 0x4) == 0x4) //rx_full
     {
       rdata = REG32(I2C_DATA_CMD); //read recv data
     }
   else if((rdata & 0x8) == 0x8) //tx_over
     {
       rdata = REG32(I2C_CLR_TX_OVER); //read clear
     }
   else if((rdata & 0x10) == 0x10) //tx_empty
     {
       REG32(I2C_DATA_CMD) = 0x12; //cpu initial data into tx fifo
     }
   else if((rdata & 0x20) == 0x20) //rd_req
     {
       REG32(I2C_CLR_RD_REQ); //clr stop
       REG32(I2C_DATA_CMD) = 0x12; //cpu initial data into tx fifo
     }
   else if((rdata & 0x40) == 0x40) //tx_abrt
     {
       rdata = REG32(I2C_CLR_TX_ABRT); //read clear
     }
   else if((rdata & 0x80) == 0x80) //rx_done
     {
       rdata = REG32(I2C_CLR_RX_DONE); //read clear
     }
   else if((rdata & 0x100) == 0x100) //activity
     {
       rdata = REG32(I2C_CLR_ACTIVITY); //read clear
     }
   else if((rdata & 0x200) == 0x200) //stop_det
     {
       REG32(I2C_CLR_STOP_DET); //clr stop
     }
}

     这里是一个通用的中断handler,大家可以根据注释以及datasheet上的描述对此进行扩展,比如有些软件需要在tm_empty中断发生的时候CPU填写数据,以及fifo full中断的时候CPU需求将数据取走等等。具体还要根据实际应用情况来做扩展。

    当然,对于EDA验证来说,这里相对来说更灵活,可以根据验证环境情况来自定义中断handler。

2.2 定义main函数

 main函数

int main()
{
   CLK_DW_I2C_EN;   //打开i2c模块的时钟使能,根据设计需求
   
   //may be i2c share gpio with module, this cfg can be used 
   GPIO_FUNC_SEL_I2C;  //配置gpio功能为DW_I2C

   set_irq_vector(NVIC_NUM_DW_I2C, (int)dw_i2c_int_handler); //配置中断服务向量
   __nds32_enable_int(NVIC_NUM_DW_I2C); //使能CPU中断

   //dw i2c initial
   REG32(I2C_ENABLE)      = 0x0;  //在配置i2c之前一定要先disable i2c_en
   REG32(I2C_SDA_HOLD)    = 0x5;  //可选,具体参考datasheet描述
   REG32(I2C_FS_SPKEN)    = 0x2;  //滤除毛刺的深度,建议根据需求配置
   REG32(I2C_TX_TL)       = 0x4;  //tx fifo水线
   REG32(I2C_RX_TL)       = 0x4;  /rx fifo水线
   REG32(I2C_CON)         = (REG32(I2C_CON) & 0xFFFFFF80) | 0x65); //master mode and 400k
   REG32(I2C_FS_SCL_HCNT) = 0x6;  //scl高电平宽度配置,根据需求修改
   REG32(I2C_FS_SCL_LCNT) = 0x6;  //scl低电平宽度配置,根据需求修改

   
   REG32(I2C_ENABLE) = 0x1; //使能i2c
   
   //填写tx fifo数据,硬件会自动将数据发送出去,这里填数据也可以放到int_handler中
   REG32(I2C_DATA_CMD) = 0x12;
   REG32(I2C_DATA_CMD) = 0x34;
   REG32(I2C_DATA_CMD) = 0x56;
   ......

   while(发送中断完成);

}

     上述main函数中,本文详细介绍了DW_i2c的初始化流程,里面的步骤基本上是必不可少的,当然,有一些配置可以根据实际情况进行调整,同时,如果使用i2c的更多功能,还需要大家自行添加相关寄存器配置。


三、总结

      这里只是介绍了master发送的相关case配置,实际上DW_I2C可以配置为master/slave模式,且两个模式可以分别支持收发,即理论上来收还有其他三种case,master收数据,slave发数据以及slave收数据。在实际设计case时,关于数据的收发可以灵活调整,借助每个中断来进行同步收发是一个比较好的编码风格。这里为了让大家更容易理解,因此设计的case简单化了。

      在实际验证过程中,不仅仅要根据需求设计严谨的case,还要同时控制收发双方的驱动程序,以及添加数据的自动化checker,这样后期在大量回归测试时,可以更快的完成回归测试。文章来源地址https://www.toymoban.com/news/detail-774271.html

到了这里,关于SOC系统经典IP介绍以及使用方法说明之dw_i2c的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用电脑联网时提示ip地址与其他系统有冲突的解决方法

    很多网友经常在使用电脑联网的时候,会看到这样的提示“ip与其他系统冲突”,但是网友不知道如何解决该问题,最后没有办法选择重装系统。 其实只要我们留意一些细节并简单的操作几下就可以解决问题了。 工具 Windows OS 网络服务支持 冲突的产生原因 1 IP地址相当于是每

    2024年02月06日
    浏览(40)
  • vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

    一、v-model是什么 v-model是Vue框架的一种内置的API指令,本质是一种语法糖写法,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。在Vue中,v-model是用于在表单元素和组件之间创建双向数据绑定的指令。它可以简化表单元素的绑定,使得在用户输入

    2024年01月19日
    浏览(47)
  • VMWARE虚拟机CentOS6.4系统使用主机无线网卡上网的三种方法介绍

    环境:WIN7旗舰版,台式机,U盘无线上网卡。 虚拟软件:VMware9.0,虚拟系统:CentOS6.4 需要实现虚拟机以独立机形式工作和上网。 介绍一下VMware网络设置的三种方式 1 Host-only连接方式   让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新

    2024年02月06日
    浏览(50)
  • Win11使用动态磁贴还原经典Win10开始菜单的方法

    Win11系统界面与之前的Windows系统有很大的不同,任务栏采用居中式,开始菜单也居中了。很多用户升级之后就觉得用得非常不习惯,想要将Win11开始菜单还原到Win10系统的样子。那么下面就来看看Win11怎么使用动态磁贴还原经典Win10开始菜单的教程。 具体操作步骤如下: 1、首

    2024年02月15日
    浏览(42)
  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使用插件将生成的图片放入pdf中,再实现pdf文件的下载 涉及框架以及插件:vue、echar

    2024年01月25日
    浏览(49)
  • python 面向对象编程的特点 - 封装 - 继承(经典类、新式类) - 多态 - 静态方法、类方法 - 下划线的使用 - 回合制攻击游戏实验

    目录 面向对象编程的特点: 封装:封装是将数据和操作(方法)封装在一个对象中的能力 继承:继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。 我们为什么需要继承呢? 父类/基类 = ATM 子类/派生类= ChinaATM/ICBCATM ATM系统父类子类讲解代码: 经典类和新式

    2024年02月15日
    浏览(46)
  • valgrind基本功能介绍、基础使用方法说明 valgrind基本功能介绍、基础使用方法说明

    valgrind基本功能介绍、基础使用方法说明_valgrind使用方法_HNU Latecomer的博客-CSDN博客 拷贝效果不好,请看原文。 1、Valgrind概述 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。 Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(f

    2024年02月07日
    浏览(60)
  • 代理ip的使用方法——Python爬虫

    本文内容:代理ip使用原理,如何在自己的爬虫里设置代理ip,如何知道代理ip有没有生效,没生效的话是哪里出了问题,个人使用的代理ip(付费)。 目录 代理ip原理       输入网址后发生了什么呢?       代理ip做了什么呢?       为什么要用代理呢?  爬虫代码中使用代

    2024年02月05日
    浏览(55)
  • Git的作用以及使用方法

    GIT,全称是分布式版本控制系统,git通常在编程中会用到,并且git支持分布式部署。 可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。

    2023年04月25日
    浏览(34)
  • 【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏 :Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 方

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包