热门标签 | 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.

 


推荐阅读
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
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社区 版权所有