TMS320F28335经验若干.docx

上传人:b****2 文档编号:17691846 上传时间:2023-08-03 格式:DOCX 页数:11 大小:23.10KB
下载 相关 举报
TMS320F28335经验若干.docx_第1页
第1页 / 共11页
TMS320F28335经验若干.docx_第2页
第2页 / 共11页
TMS320F28335经验若干.docx_第3页
第3页 / 共11页
TMS320F28335经验若干.docx_第4页
第4页 / 共11页
TMS320F28335经验若干.docx_第5页
第5页 / 共11页
TMS320F28335经验若干.docx_第6页
第6页 / 共11页
TMS320F28335经验若干.docx_第7页
第7页 / 共11页
TMS320F28335经验若干.docx_第8页
第8页 / 共11页
TMS320F28335经验若干.docx_第9页
第9页 / 共11页
TMS320F28335经验若干.docx_第10页
第10页 / 共11页
TMS320F28335经验若干.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

TMS320F28335经验若干.docx

《TMS320F28335经验若干.docx》由会员分享,可在线阅读,更多相关《TMS320F28335经验若干.docx(11页珍藏版)》请在冰点文库上搜索。

TMS320F28335经验若干.docx

TMS320F28335经验若干

TMS320F28335开发过程中常见问题总结

1.SPI驱动TLE7241E出现返回值不对的问题。

主要是由于时序的不对,导致TLE7241E输入采样时数据还没有建立,所以TLE7241E收到的命令不正确,所以返回值不正确。

2.SPI驱动EEPROM时,如果用金属物触到clockpin时,能正确运行,否则不能正确运行。

出现次问题也是由于时序的问题,金属物触到clock导致clock出现微小幅度的偏移,导致正好和eeprom的时序对上,而不用金属物触碰时时序不正常,当使dspMOSIpin数据发送提前半个周期后,eeprom工作正常。

3.示波器有时会导致显示的波形被消尖,所以用示波器测量时周期不能太大。

 

TMS320F28335笔记-I2C

1.响应和非响应的区别是什么?

关于i2c的响应问题:

对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。

因此,themasterdevice必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。

在这个脉冲期间,发出响应的从设备必须将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.DSPreset后运行的起始地址是多少?

0x3FFFC0

2.仿真器烧写程序的步骤是?

根据cmd文件把程序烧到指定位置,然后执行。

3.DSP的Flash启动过程是什么?

首先硬件配置GPIO84~87上拉为1,即处于Flash启动过程。

当DSP复位后,会从复位向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO84~87的值发现全为1判断为Flash启动方式。

然后会跳到0x33FFF6处执行。

在CCS5.2工程的cmd文件中有如下代码:

MEMORY

{

PAGE0:

  BEGIN   :

origin=0x33FFF6,length=0x000002  /*BoottoM0willgohere           */

...

}

SECTIONS

{...

codestart     :

>BEGIN   PAGE=0

...}

即表示把codestart段放到0x33FFF6位置处,文件“DSP2833x_CodeStartBranch.asm”中有codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00在boot.asminRTSlibrary中有定义,_c_int00的代码最终会调用c的main函数,之后就是main函数的执行。

4.F28335如何烧写代码到flash中并运行?

首先使用添加C:

\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_common\cmd\F28335.cmd。

此文件即为配置代码到flash中的TI官方配置文件。

然后参考C:

\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_examples_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(_RamfuncsLoadStart),

             LOAD_END(_RamfuncsLoadEnd),

             RUN_START(_RamfuncsRunStart),

             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中,而在SARAML0中运行,这只是目标,实际运行时DSP并不会自动将Flash中的代码拷贝到SARAM中,因此需要手动添加代码来完成。

在C函数中,为了使用变量RamfuncsLoadStart、RamfuncsLoadEnd和RamfuncsRunStart,必须先声明,本工程在文件DSP2833x_GlobalPrototypes.h中做了如下声明:

externUint16RamfuncsLoadStart;

externUint16RamfuncsLoadEnd;

externUint16RamfuncsRunStart;

然后就可以使用了。

在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申明。

如:

#pragmaCODE_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;

参考网址:

2.中断标志有几级?

作用是什么?

中断标志主要有三级CPU(有16个标志位)、PIE(有12组每组有12个标志位)和外设(有的外设没有)。

标志位在中断发生后锁存中断状态,即表示中断发生。

在CPU响应中断后,会自动清除cpu级别的标志位IFRbit,同时将INTMbit置位,以防止其它中断的发生;CPU在从PIE中取中断向量时PIE会自动清除PIE级别的标志位PIEIFRx.y。

所以在进入中断处理程序后除了外设所有中断位都已经清除。

而中断处理程序中需要清除PIEACKx和外设的中断标志位(如果有的话)。

参考网址:

 

TMS320F28335笔记-SPI模块

什么是SPI接口?

SPI接口是高速同步串行输入输出接口。

TMS320F28335有几个SPI接口模块?

有一个专门的SPI模块,另外两个McBSP也可以配置为SPI接口。

TMS320F28335SPI接口由几组寄存器控制?

12组,位于控制寄存器帧0x7040h开始的位置。

所有的寄存器都为16bit寄存器

FIFO有几级?

16级

SPIFIFO模式下如何对传输和接收FIFO进行操作?

直接对SPITXBUF进行赋值以传输数据例如:

SpiaRegs.SPITXBUF=sdata[i]。

此操作可理解为:

首先使TXFIFO头指针加1,然后把值写入TXFIFO头指针指向的位置。

如果当前没有一个激活的传输过程时,对SPITXBUF的写入会激活一个传输过程。

直接读取SPIRXBUF的值以接收数据例如:

rdata[i]=SpiaRegs.SPIRXBUF,此操作可理解为:

首先从RXFIFO头指针处读取1个word,然后使RXFIFO头指针减1。

SPIFIFO模式下传输和接收中断何时产生?

是在数据传输或接收结束后,再判断传输和接收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?

他们和标准SPIpin的对应关系是什么?

SPICLK->MCLKX

SPISIMO->MDX

SPISOMI->MDR

SPISTE->MFSX

SPITXINT->

SPIRXINT->

3.McBSP如何开启clockstopmode以兼容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.CCS5.2如果没有包含函数的声名头文件时也能运行但是结果会不正常,故当函数调用出现莫名其妙的问题时,要检查声名函数的头文件是否包含。

5.CCS5.2开发DSP28335程序时如何设置程序堆栈的大小?

CCS5.2默认情况下堆栈的大小都为0x400,在Project->Properties->Build->C200Linker->BasicOptions下设置。

设置完堆栈的大小后,还要在cmd文件中分配堆栈存储空间的

段的位置和大小,栈空间的段名为.stack用于函数中的临时变量,堆空间的段名为.sysmem用于c语言malloc函数分配内存,malloc最大可分配内存为Project->Properties->Build

->C200Linker->BasicOptions下设置的大小减2。

cmd文件中的堆栈段的大小不能小于Project->Properties->Build->C200Linker->BasicOptions下设置的大小。

一般来讲不用

变动栈空间的大小和位置,如果函数中需要大的空间就申请堆空间。

堆空间可以指定为外部内存,但要注意在第一次malloc函数调用之前一定要初始化外部内存。

否则malloc能执行成功但是空间指向未定。

heap大小限制为32kword即0x10000。

6.相关参考网站

7.如何添加头文件的相对路径?

首先在Project->Properties->Build选项下,点击Variables添加一个变量,然后就可以在Project->Properties->Build->C2000Compiler->IncludeOptions下用${}引用变

量。

表示工程路径的系统变量是PROJECT_ROOT,可以在Project->Properties->Build->C2000Compiler->IncludeOptions下直接引用。

注意Project->Properties->Resource-

>LinkedResources下的变量在Project->Properties->Build->C2000Compiler->IncludeOptions下无效,只有Project->Properties->Build下Variables选项卡中的变量才能

用。

8.当程序烧写到flash中运行时,设置断点为什么总是出错?

当程序烧写到flash中时设置的断点为硬件断点,此断点对C28x系列DSP只能设置两个多的话就会报错,另外有些函数有可能会占用硬件断点,故设置断点失败时可查一下如何清理c函数的硬件断点。

9.CCS5Debug模式下Tool->Graphs的用法的要点?

进入CCSDebug模式,点击debug按钮右边的小箭头打开下拉列表,选中DebugConfigurations,在target选项卡下选择RealtimeOptions->Haltthetargetbeforeanydebuggeraccess。

如果不选此项当targetrunning时,graph波形会是一条为0的直线。

在代码中打断点,运行到断点处,因为只有运行在断点处Graphs才能识别变量地址,才能在设定Start  Address时使用数组名和&变量名的形式。

∙Graphs只能跟踪全局变量,所以缓冲区要设置为全局变量。

参考网址:

10.如果ccs出现莫名其妙的问题时,请删除.metadata

11.arm和dsp之间进行串口通信如果dsp先启动,arm后启动,通讯有异常,反之正常?

主要原因是arm启动时会有一个导致BRKDT错误的信号出现,此时如果dsp已经启动就会收到此错误,并停止工作,直到SWRest或者DSP重启。

解决方法是当收到此错误时,SWResetSCI模块。

参考网址:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2