为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

TMS320F28335经验若干

2019-04-22 14页 doc 35KB 17阅读

用户头像

is_841159

暂无简介

举报
TMS320F28335经验若干TMS320F28335开发过程中常见问题总结 1.SPI驱动TLE7241E出现返回值不对的问题。主要是由于时序的不对,导致TLE7241E输入采样时数据还没有建立,所以TLE7241E 收到的命令不正确,所以返回值不正确。 2.SPI驱动EEPROM时,如果用金属物触到clock pin时,能正确运行,否则不能正确运行。出现次问题也是由于时序的问题,金属物触到clock导致clock出现微小幅度的偏移,导致正好和eeprom 的时序对上,而不用金属物触碰时时序不正常,当使dsp MOSIpin数据发送提前半个周期后,...
TMS320F28335经验若干
TMS320F28335开发过程中常见问总结 1.SPI驱动TLE7241E出现返回值不对的问题。主要是由于时序的不对,导致TLE7241E输入采样时数据还没有建立,所以TLE7241E 收到的命令不正确,所以返回值不正确。 2.SPI驱动EEPROM时,如果用金属物触到clock pin时,能正确运行,否则不能正确运行。出现次问题也是由于时序的问题,金属物触到clock导致clock出现微小幅度的偏移,导致正好和eeprom 的时序对上,而不用金属物触碰时时序不正常,当使dsp MOSIpin数据发送提前半个周期后,eeprom工作正常。 3.示波器有时会导致显示的波形被消尖,所以用示波器测量时周期不能太大。 TMS320F28335笔记-I2C 1.响应和非响应的区别是什么? 关于i2c的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。因此, the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。 在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。这示该设备给出了一个ACK。如果它不拉低SDA线,就表示不响应(NACK)。 另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SDA释放了,而后,主机发出一个停止位给slaver。 总结下,i2c通讯中,SDA 和 SCL 都是有主机控制的,从设备只是能够将SDA线拉低而已。对于SCL线,从机是没有任何能力去控制的。从机只能被动跟随SCL 再说的清楚些:主机发送数据到从机的状态下:主机控制SCL信号线和SDA信号线,从机只是在SCL线为高的时候去被动读取SDA线。主机读取从机的数据:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SDA的状态而已。 SDA和SCL已经通过上拉电阻被上拉,master可以控制(拉低或者释放)这两条线,而slaver只能控制SDA线。当master发送数据时,master会适时地将SDA和SCL拉低或释放(拉高)。确切的时序应该是这样的:当mater要发送一个start时,mater会将SDA拉低,这就可以了,因为此时的SCL一定是High。好了,一个start就这样发出去了。而slaver也会发现这个start信号的发生,slaver便会准备好接收接下来的数据了。紧接着,master要发送一个Byte的数据了,一位一位的发出这8个bits。这时master会先将SCL拉低,然后在SCL为低的状态下将一个bit准备好放到SDA上(比如要发送一个 0,master就会通过拉低SDA来放好这个0),然后master会把SCL拉高(释放),此时slaver会立刻检测到SCL的变化,由此 聪明的slaver便知道master已经将要发送的那个bit准备好了, slaver便会在这个SCL的高电平期间尽快(maser不会等你很久的哦)去读取一下SDA,嗯读到了一个0,slaver就把这个0放到自己的移位寄存器中待后续处理。master会在一个设定好的时间后把SCL再次拉低,然后在SCL为低电平期间把下一个bit放到SDA上,然后再把SCL拉高,然后slaver在SCL的高电平期间再去读SDA。。。。。如此反复8次,一个Byte的传输便告结束。当这8个bit发完后, SCL是处于低电平的(被master拉低的),SDA是出于高电平的(master 已经释放了SDA)。 当一个字节发送完毕后,master会释放SDA(拉高)并拉低SCL,此时slaver如果打算发出一个ACK的话,它必须在这个SCL被master 拉低的短暂时间内去主动将SDA拉低并保持住 (此前我们说过,SDA 此时已经被master释放,所以slaver才有机会去拉低这个SDA)。master会在一个确定的时间后再次将SCL拉高,并在拉高的期间去读取SDA线的状态,如果读到低电平,则认为收到了来自slaver的响应(ACK),否则认为slaver没有响应(NACK)刚才发送的那一个Byte。这个过程就是我们说的i2c通讯中的第9个时钟周期。当master 读完这个ACK / NACK 后,会再次将SCL拉低,用以通知slaver:第9个时钟周期已经结束,你现在可以释放SDA了。而此时master也可以向SDA上准备下一个Byte的第一个bit。继而重复上述过程。。。。。或者,master也许想在接下来发送一个stop过去,那么master会在这个SCL为低的时间内将SDA拉低,而后再将SCL拉高,在SCL为 高的期间再将SDA释放 (拉高) 。这样,一个STOP位就产生了。你会发现此后的SDA和SCL都是高,这就是是所谓的总线空闲了! 一句话:SCL是单向的,由master控制。而SDA是双向的,master 可以控制,slaver也可以控制。 2.示波器探头会对波形产生影响,导致波形延时,使用是请注意。 TMS320F28335学习笔记-ADC控制器 1.ADC的工作模式有哪些? 同时采样模式和顺序采样模式。 2.ADCINT与SEQ1INT、SEQ2INT中断有什么区别 SEQ1INT和SEQ2INT对应序列器SEQ1和SEQ2的中断,ADCINT是为了向前兼容F281x系列的ADC中断,可以由SEQ1或SEQ2触发产生。在ADCINT中断服务程序里,需要软件干预去根据对应标志位确定到底是哪个序列产生了中断,而SEQINT1&2是不需要的。 TMS320F28335笔记-启动过程 1.DSP reset后运行的起始地址是多少? 0x3FFFC0 2.仿真器烧写程序的步骤是? 根据cmd文件把程序烧到指定位置,然后执行。 3.DSP的Flash启动过程是什么? 首先硬件配置GPIO84~87上拉为1,即处于Flash启动过程。当DSP复位后,会从复位向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO84~87的值发现全为1判断为Flash启动方式。然后会跳到0x33FFF6处执行。在CCS5.2工程的cmd文件中有如下代码: MEMORY { PAGE 0 : BEGIN : origin = 0x33FFF6, length = 0x000002 /* Boot to M0 will go here */ ... } SECTIONS {... codestart : > BEGIN PAGE = 0 ...} 即表示把codestart段放到0x33FFF6位置处,文件 “DSP2833x_CodeStartBranch.asm”中有codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00在boot.asm in RTS library中有定义,_c_int00的代码最终会调用c的main函数,之后就是main函数的执行。 4.F28335如何烧写代码到flash中并运行? 首先使用添加 C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_comm on\cmd\F28335.cmd。此文件即为配置代码到flash中的TI官方配置文件。 然后参考 C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_exam ples_ccsv4\flash_f28335。添加以下代码: MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);将一些在内存中运行的代码从flash复制到内存中,然后程序才能正常运行。 5.写好的代码再ram中能正常运行但是烧写到flash中后,函数DSP28x_usDelay()不能正常运行为什么? 因为在DSP2833x_usDelay.asm中有.sect "ramfuncs",即把该函数定义在段"ramfuncs"中,而此段需要在内存中运行,故需要使用函数 MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);将ramfuncs段复制到内存中然后运行。只算以这样设计是因为函数DSP28x_usDelay()精准运行对运行速度有要求故必须放在段"ramfuncs"中。参考: 6.cmd中以下代码如何解释? ramfuncs : LOAD = FLASHD, RUN = RAML0, LOAD_START(_RamfuncsL oadStart), LOAD_END(_RamfuncsLoa dEnd), RUN_START(_RamfuncsRu nStart), PAGE = 0 第1行表示该段的装载在PAGA0的FLASHD中 第2行表示该段的运行地址在PAGE0的RAML0中 LOAD_ START(_RamfuncsLoadStart)令编译器创建了一个变量RamfuncsLoadStart,该变量指向段ramfuncs的装载地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档); LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址(LOAD_ END为编译伪指令,请见CCS的帮助文档); LOAD_ START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档); 从第1和2行可以看出,段ramfuncs中的函数DSP28x_usDelay()的装载地址和运行地址是不同的,本程序中装载在Flash的块FLASHD 中,而在SARAM L0中运行,这只是目标,实际运行时DSP并不会自动将Flash中的代码拷贝到SARAM中,因此需要手动添加代码来完成。 在C函数中,为了使用变量RamfuncsLoadStart、RamfuncsLoadEnd 和RamfuncsRunStart,必须先声明,本工程在文件 DSP2833x_GlobalPrototypes.h中做了如下声明: extern Uint16 RamfuncsLoadStart; extern Uint16 RamfuncsLoadEnd; extern Uint16 RamfuncsRunStart; 然后就可以使用了。在Main.c中,使用MemCopy()函数将段ramfuncs 中的函数DSP28x_usDelay()的代码从装载地址RamfuncsLoadStart —RamfuncsLoadEnd拷贝到RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,都会自动地指向SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在MemCopy.c中,DSP2833x_GlobalPrototypes.h声明。7.如何将一个函数放到ram中运行? 参考TI公司头文件中自带InitFlash函数,这些函数会以CODE_SECTION申明。如:#pragma CODE_SECTION(InitFlash, "ramfuncs"); TMS320F28335笔记-中断 1.如何开启某个中断? 设置中断向量。例如:PieVectTable.WAKEINT = &wakeint_isr; 打开PIE控制器。PieCtrlRegs.PIECTRL.bit.ENPIE = 1; 使能PIE中对应外设的中断(相应group的相应pin)。例如: PieCtrlRegs.PIEIER1.bit.INTx8 = 1; 使能CPU的相应中断(INT1~INT12)IER |= M_INT1; 使能CPU响应中断EINT; 参考网址: 中断标志有几级?作用是什么? 中断标志主要有三级CPU(有16个标志位)、PIE(有12组每组有12个标志位)和外设(有的外设没有)。标志位在中断发生后锁存中断状态,即表示中断发生。在CPU响应中断后,会自动清除cpu级别的标志位IFR bit,同时将INTM bit 置位,以防止其它中断的发生;CPU在从PIE中取中断向量时PIE会自动清除PIE级别的标志位PIEIFRx.y。所以在进入中断处理程序后除了外设所有中断位都已经清除。而中断处理程序中需要清除PIEACKx和外设的中断标志位(如果有的话)。 参考网址: TMS320F28335笔记-SPI模块 什么是SPI接口? SPI接口是高速同步串行输入输出接口。 TMS320F28335有几个SPI接口模块? 有一个专门的SPI模块,另外两个McBSP也可以配置为SPI接口。 TMS320F28335SPI接口由几组寄存器控制? 12组,位于控制寄存器帧0x7040h开始的位置。所有的寄存器都为16bit寄存器 FIFO有几级? 16级 SPI FIFO模式下如何对传输和接收FIFO进行操作? 直接对SPITXBUF进行赋值以传输数据例如: SpiaRegs.SPITXBUF=sdata[i]。此操作可理解为:首先使TXFIFO头指针加1,然后把值写入TXFIFO头指针指向的位置。 如果当前没有一个激活的传输过程时,对SPITXBUF的写入会激活一个传输过程。 直接读取SPIRXBUF的值以接收数据例如: rdata[i]=SpiaRegs.SPIRXBUF,此操作可理解为:首先从RXFIFO头指针处读取1个word,然后使RXFIFO头指针减1。 SPI FIFO模式下传输和接收中断何时产生? 是在数据传输或接收结束后,再判断传输和接收FIFO队列中有多少数据(SPIFFTX.TXFFST4-0和SPIFFRX.RXFFST4-0的值)。对于传输FIFO如果FIFO中数据小于等于TXFFIL4-0(此寄存器指定临界值)指定的值时会触发中断,在中断处理例程中继续传输数据。对于接收FIFO如果FIFO中的值大于等于RXFFIL4-0中指定的值时触发中断,在中断处理例程中接收数据。故FIFO模式下中断触发条件除了SPI模式下的数据传输接收完毕的条件外还要满足FIFO中的数据小于等于TXFFIL或大于等于RXFFIL设定值的条件,在两个条件都满足的情况下才会触发中断。另外一般情况下,FIFO模式SPI初始 化完后会立即产生以个传输中断,因为此时TXFIFO没有数据满足产生中断的条件。 如果只接收数据不发送数据如何激活接收过程? SPI的的接收过程必须依赖传输过程,故即使值接收数据也必须对SPITXBUF写入以激活一个传输过程来接收数据。 TMS320F28335笔记-McBSP模块 1.McBSP接口总共有几个?每个McBSP接口有几根pin? TMS320F28335总共有两个McBSP接口。每个接口有六根pin,分别是:MFSX, MFSR, MCLKX, MCLKR, MDX, MDR。 2.McBSP用于SPI模式时使用那些pin?他们和标准SPI pin 的对应关系是什么? SPICLK->MCLKX SPISIMO->MDX SPISOMI->MDR SPISTE->MFSX SPITXINT-> SPIRXINT-> 3.McBSP如何开启clock stop mode以兼容SPI接口? 通过CLKSTP、CLKXP和CLKRP来配置时钟的极性和延时的SPI兼容模式。 DSP28335研发笔记 1.如何查看CCS5.2中包含的源文件有哪些?以及他们的位置? CCS5.2工程中C语言源文件有两部分组成,一部分是在project 路径下的.c文件,另外一部分是通过连接添加到工程里的(.project 文件中的字段)。因此CCS5.2中的源文件一部分在工程目录下,另外一部分在.project文件中的字段包含的路径下。 2.CCS中GEL文件的作用是什么? ccs的gel语言是一种交互式的命令,它是解释执行的,即不能被编译成可执行文件。它的作用在于扩展了ccsstudio的功能,可以用gel来调用一些菜单命令,对DSP的存储器进行配置等等。但是作者建议对于使用仿真器和DSP功能板的仿真环境用户来说,这种GEL 语言文件是没必要加入到配置中的。gel语言的重要性在于针对计算机模拟环境的用户,使用gel可以为其准备一个虚拟的DSP仿真环境,但也不是非用不可的。 3.引用例子中的源文件时要注意什么? 使用CCS5.2导入例子中的源文件时,最好不要选择连接方式,而使用复制的方式,这样必要时可以更改这些源文件,而不会影响其他的程序的使用。 4.CCS 5.2如果没有包含函数的声名头文件时也能运行但是 结果会不正常,故当函数调用出现莫名其妙的问题时,要检查声名函数的头文件是否包含。 5.CCS5.2开发DSP28335程序时如何设置程序堆栈的大小? CCS5.2默认情况下堆栈的大小都为0x400,在 Project->Properties->Build->C200 Linker->Basic Options下设置。设置完堆栈的大小后,还要在cmd文件中分配堆栈存储空间的 段的位置和大小,栈空间的段名为.stack用于函数中的临时变量,堆空间的段名为.sysmem用于c语言malloc函数分配内存,malloc 最大可分配内存为Project->Properties->Build ->C200 Linker->Basic Options下设置的大小减2。cmd文件中的堆栈段的大小不能小于Project->Properties->Build->C200 Linker->Basic Options下设置的大小。一般来讲不用 变动栈空间的大小和位置,如果函数中需要大的空间就申请堆空间。堆空间可以指定为外部内存,但要注意在第一次malloc函数调用之前一定要初始化外部内存。否则malloc能执行成功但是空间指向未定。 heap大小限制为32k word即0x10000。 6.相关参考网站 7.如何添加头文件的相对路径? 首先在Project->Properties->Build选项下,点击Variables 添加一个变量,然后就可以在Project->Properties->Build->C2000 Compiler->Include Options下用${}引用变 量。表示工程路径的系统变量是PROJECT_ROOT,可以在 Project->Properties->Build->C2000 Compiler->Include Options 下直接引用。注意Project->Properties->Resource- >Linked Resources下的变量在 Project->Properties->Build->C2000 Compiler->Include Options 下无效,只有Project->Properties->Build下Variables选项卡中的变量才能 用。 8.当程序烧写到flash中运行时,设置断点为什么总是出错? 当程序烧写到flash中时设置的断点为硬件断点,此断点对C28x 系列DSP只能设置两个多的话就会报错,另外有些函数有可能会占用硬件断点,故设置断点失败时可查一下如何清理c函数的硬件断点。 9.CCS5 Debug模式下Tool->Graphs的用法的要点? 进入CCS Debug模式,点击debug按钮右边的小箭头打开下拉列表,选中Debug Configurations,在target选项卡下选择Realtime Options->Halt the target before any debugger access。如果不选此项当target running时,graph波形会是一条为0的直线。 在代码中打断点,运行到断点处,因为只有运行在断点处Graphs 才能识别变量地址,才能在设定Start Address时使用数组名和&变量名的形式。 Graphs只能跟踪全局变量,所以缓冲区要设置为全局变量。参考网址: ://www.61ic.com/Article/CCS/Experience/201211/45940.htm l 10.如果ccs出现莫名其妙的问题时,请删除.metadata 11.arm和dsp之间进行串口通信如果dsp先启动,arm后启动,通讯有异常,反之正常? 主要原因是arm启动时会有一个导致BRKDT错误的信号出现,此时如果dsp已经启动就会收到此错误,并停止工作,直到SW Rest或者DSP重启。解决是当收到此错误时,SW Reset SCI模块。 参考网址:
/
本文档为【TMS320F28335经验若干】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索