热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IIC加载以及存在的问题---latticeXO3

XO2XO3系列使用IIC进行在线升级的时候使用的I2CEmbedded(在diamond软件安装目录下可以找到在线升级的C代码,<install_path>\embedded_sou

XO2/XO3系列使用IIC进行在线升级的时候使用的I2C Embedded(在diamond软件安装目录下可以找到在线升级的C代码,<install_path>\embedded_source\i2cembedded\src\i2cem),IIC总线的信号是漏极开路的,所以默认情况下是,信号线是低电平,需要加上啦电阻,使其默认是高电平。IIC总线上建议不要挂太多的器件,建议只挂我们一个CPLD,因为信号质量无法保证。为了能够使用IIC总线进行在线加载(program),I2C_PORT必须要设置为ENABLE特别是使用2B线,用PC烧写的时候(默认是diable3.2以前的版本是直接软件里面改为ENABLE就可以了但是3.2以后的版本设置相对复杂点),diamond3.2及以前版本中设置如下截图

diamond3.2以后的版本如何使能I2C_PORT,先看看用上述操作的结果,如下图报错了呵呵

那么我们要加入EFB模块,而且wb_clk_i的频率要>=3MHZ,而且还有把sda scl引到顶层。调用EFBPrimary ConfigurationUser Flash Memory一定都要选上,如下图

代码中例化如下

/*******************************************************************

*******************************************************************/

module       control(

inout       wire            scl,

inout       wire            sda

);

 

wire osc_clk;

defparam OSCH_inst.NOM_FREQ = "7.00";

 

OSCH OSCH_inst( .STDBY(1'b0),  // 0=Enabled, 1=Disabled

.OSC (osc_clk),

.SEDSTDBY()

   );

 

 

efb    efb_inst(.wb_clk_i( osc_clk),

.i2c1_scl( scl ), //要把IIC的脚接到顶层

.i2c1_sda( sda )

/* .wb_rst_i( ),

.wb_cyc_i( ),

.wb_stb_i( ),

.wb_we_i( ),

.wb_adr_i( ),

.wb_dat_i( ),

.wb_dat_o( ),

.wb_ack_o( ),

.i2c1_irqo( ),

.wbc_ufm_irq( )*/

);

endmodule

/*******************************************************************

*******************************************************************/

不选Primary ConfigurationIIC脚根本就无法访问,也就无法使能,同时MAP的时候也会报上诉错误,如下图没有i2c1_sda  i2c1_scl

不选User Flash Memorywb_clk_i无法给入,同时MAP的时候也会报上诉错误,如下图没有i2c1_sda  i2c1_scl

1.跑一遍产生.JED

 

2按照ProgrammingToolsUserGuide38128继续往下跑设置流程截图如下

随便解释一下.iea是指令  .ied是数据,给出的参考嵌入式代码不是lattice自己人写的,是lattice找人开发的,所以有BUG的话是没办法解决的,只能避开。所以建议客户不要用传.iea  .ied的参考代码。客户自己写C代码,只传要加载的数据,这样出了问题客户自己可控,就不用找我们麻烦。

在安装目录C:\lscc\diamond\3.8_x64\embedded_source\i2cembedded\src有两份IIC加载的C代码,这个是客户根据需求选择的

调试过程

感觉XO3LF空白芯片(擦除后和买回来没试用过的芯片)没法在线加载,调了好几天没有几把用,XO2我之前在另外一个部门调试是OK的。调试的思路和过程如下

 

首先检查客户的硬件PROGRAMN和SN管脚都是已经拉高了,这个是因为加载时有优先级的,而且空白芯片SPI IIC JTAG使能都是打开的,假如那两个脚没有拉高进入他们的加载状态,IIC优先级比较低级无法进入IIC在线升级的状态了,优先级JTAG>SPI>IIC

 

 

 

然后测试了以下几种情况

1.例化EFB,把IIC脚拉到顶层,通过jtag方式烧写到芯片,然后用CPUCPLD

进行在线升级是可以的,具体操作流程如下

/**********************JTAG烧写的代码***************/

module       control(

inout       wire            scl,

inout       wire            sda

);

 

wire osc_clk;

defparam OSCH_inst.NOM_FREQ = "7.00";

 

OSCH OSCH_inst( .STDBY(1'b0),  // 0=Enabled, 1=Disabled

.OSC (osc_clk),

.SEDSTDBY()

   );

 

 

efb    efb_inst(.wb_clk_i( osc_clk),

.i2c1_scl( scl ),

.i2c1_sda( sda )

);

endmodule

/**********************JTAG烧写的代码***************/

烧写完毕之后,用CPUCPLD进行在线升级是没有问题的,作为对比我读取了Feature Rows的值

 

首先先把芯片jed读回来

然后在用软件读取读回来的JEDfeature rows的值,操作如下

跳出来一个界面,操作如下

 

读回来的信息如下

 

default是默认值,IIC_PORT默认值是打开的(Enable,也就是说FILE_VALUE=0,说明是打开的,当擦除之后FILE_VALUE的所有值应该与default所有值相同

/**********************JTAG烧写的代码***************/

module       control(

output       wire            led

);

 

assign led=1;

endmodule

/**********************JTAG烧写的代码***************/

 

烧写流程如上,现仅将回来的feature rows的值作为对比,如下图

 

发现读回来的值是不一样的file value=1,这个应该是关掉了IIC_PORT,但是默认的情况不是打开的吗?是什么操作是它被关掉的呢?然后查了手册,手册写的默认值如下图,感觉好奇葩file value=1不是关掉IIC_PORT吗?怎么手册给出来的值是file value=1HW DEFAULT中确是ENBALE

疑问自答:1.读回来的file value=1是关掉IIC_PORT的意思,芯片默认确实是打开的,但是软件默认是关闭的IIC_PORT,而且下载了一段不加EFB去打开IIC_PORT的代码,所以IIC_PORT自然而然就关掉了,所有IIC无法在线升级就可以理解了,因为IIC_PORT被关掉了啊。

2.写文档的人瞎搞,截出来的图不是空白芯片的值,只是一个feature rows的例子而已。

 

 

 

 

3.尝试了用jtag对芯片进行擦除操作,再进行在线加载,发现也是无法在线加载的,表现为没有发响应,iic没有通信上(手册上说这种方式可以实现在线升级的,草)。操作流程如下:

 

擦除之后用jtag回读回来的feature rows的值如下

 

 

通过对比可以发现,FILE Value=0的时候且在有程序的前提下,是可以实现在线加载的。但是这个官网数据手册说的不一致,数据手册说空白芯片和擦除的情况下是可以进行在线加载的。所以得继续查问题______————————________

 

经过对比调试发现,有程序在芯片时,program=1diable,IIC_PORT=0(enable);空白芯片时program=0enable, IIC_PORT=0(enable),如下图。

 

所以尝试测试在有程序的情况下,把Program改为enable,假如修改为Program改为enable之后,无法实现在线升级了,那么问题就明了了,下图是如何把Program改为enable

 

修改了之后发现确实无法升级了那么是不是可以说明是Programenable使得无法进行在线升级呢?为了确保万无一失,我们再进行一个测试。在芯片没有程序的情况下,将Program改为disable。这个怎么改呢?有点学问。首先你不能烧程序进去,因为烧了程序进去就不是空白芯片了,其次你还要修改program的值,而且只改一位。不幸中的万幸,软件可以进行只加载Feature row,也就是说我可以通过通过软件生成带程序的而且programdisableJED,然后加载JED的时候只进行feature row的加载,不加载用户逻辑。操作如下

操作完上述过程相当于空白芯片,Program改为disable,嵌入式系统那边跑起来,惊奇发现测试灯亮了,亮了(用于测试升级的代码),妈呀成功了。

 

以上说明什么问题,lattice给的升级参考嵌入式代码有问题,有BUG。为什么这样说呢?因为我们用2B线测试过,不管在什么情况下,都是可以program的,说明不管Programdisabe还是enable,不管是不是空白芯片,都是可以program的。唯一的不就是一个通过C代码配合CPUprogram,一个是通过线去加载,硬件完全一样。

 

 

通过上述可以明显知道是lattice提供的C代码有bug,那么在线升级的时候怎么解决呢?做了上面的测试,思路很明显出来了。生成两份.ied .iea,第一份做事情是将空白芯片的Program改为disable,第二份做的事情是加载用户逻辑,当然客户嵌入式那边也要做两份Makefile。为了修复这个BUG,如下做出详细操作流程。

 

生成第一份.ied .iea,目的Program改为disable

 

做好下图设置之后先生成.jed

 

 

下面这一步非常重要一定要选对选只加载feature的值这就相当于只把program改为diable而不加载用户程序,然后狂点next就可以生成了。

 

生成第二份.ied .iea,目的是生成加载的用户程序,流程在最开始就说了,不再累赘。

 

用两份IED IEA,可以实现空白芯片的加载,但是在客户多次尝试之后发现新的问题:芯片里面有程序的时候,用用两份IED IEA是无法在线加载的!!!!!!!现在出现了两种情况:有程序的时候,只能用有用户数据的IEA IED去升级,没有程序的时候需要用两份IEA IED去升级。叫客户将就着用,但是客户死活不肯。接下来的解决思路:通过CPU发读Read FEABITs (0xFB)指令PROGRAMN的值读回来PROGRAMN=1,说明是有程序(有feature row)在芯片的,这时候让CPU去加载两份IEA IEDPROGRAMN=0,说明是没有程序(擦除过或者是出厂的空白芯片)在芯片的,这时候让CPU只加载一份包含用户逻辑数据的IEA IED。这个方法就需要用户去写C,试了好几天大华也没写出来。另辟蹊径,看了各种手册,发现有程序(有feature row)的时候,写两份IEA IED无法实现在线加载,原因是加载第一份的时候feature row已经被写过一次,在不擦除去情况下,再去写feature row就会导致芯片hold死,从而导致芯片升级不成功。那么解决思路就出来,无论哪种情况,都用两份IEA IED实现在线加载,但是在加载第一份IEA IED(仅仅包含feature row的值)之前,先erase一次feature row,问题就可以解决了。但是问题又来了,erase feature row怎么操作呢?是否有这个指令让cpuerase feature row。幸运的是,在文档中给出了这个指令。

仔细想想这个方法还是不够简洁,既然可以通过cpu去发erase feature row,那么软件生成的时候应该也有对应的选型,然后在软件中找到对应的,感觉像自己想要的选型,进行尝试。非常有意思,一把就试成功,不管有没有程序,不管是否断电,在生成第一份IEA IED的时候,选择I2C Erase Program Verify Feature一切搞定(因为这个选项包含erase feature row),选项如下截图。

总结IIC升级步骤:

1)调用EFBIIC_PORT口打开

2)生成第一份IEA IED,目的disable programn而且应该选择I2C Erase Program Verify Feature(这选项会更新Feature Row的值的),仅仅更新Feature Row

3)生成第二份IEA IED,目的生成用户数据,而且应该选择I2C Erase,Program,Verify(这选项是不会更新Feature Row的值的),仅仅更新用户逻辑

 

 

 

结束语干这行的,一定要有怀疑的精神,怀疑的不仅仅是客户芯片厂家也是完全可能出现问题的,厂家的bug也是正常的厂家没有BUGFAE就没有存在的意义了。上述发现的BUG不是芯片本身的bug,是提供的参考C代码的bug.

 


推荐阅读
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
author-avatar
隐阁6090j
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有