dsp开发心得(新手上路,勿笑)
某日对dsp产生兴趣!
买了n本中文书,看得云里雾里,但也算是了解一二了!
去了几个论坛问了n多弱智问题,终于了解了二三!并知道dsp的圣地:www.ti.com
下载了n多54的pdf文件!宝贝呀!
最后在编程调试当中发现:对于新手来说ccs的help是一个很不错东东,同时bootloader源程序,可以领你进入更深入的dsp世界,更容易的理解dsp的各个外设部分。
推荐几个不错的网站:
http://www.dspsolution.com
http://www.seeddsp.com/
http://www.dspchina.com/
DSP开发手记(第一日)
配合紧张的项目进度,匆匆送出去做的PCB样机板终于在5天后拿到了。。。
上午,赶紧安排人焊接,自己继续编写还没有赶出来的扫描端口控制程序。
下午,按照我的要求,电源部分先焊接调试没有问题了;DSP芯片工作必须器件都焊完了,什么晶振啊、复位电路和电源什么的,OK,接上JTAG口试一下,“无法复位目标系统,重试、退出、取消”,检查硬件连接,重试、重试,n次后,仍然如故。。。
靠,惨啦,自己搞的系统原理图是不是有问题啊,第一次搞,又没有找到参考设计,难道JTAG口工作也要求DSP外围RAM、Flash等等要正常工作?
苦恼中。。。
DSP开发手记(第二日)(1)
今天是周六,根据以往的经验,这两个休息天是效率最高的日子(没有人打扰,可以专心编程调试),所以希望今天会有好收获。
拿出昨天晚上在一些DSP论坛上找到的信息纪录,先试一下看。
“JTAG口工作的基本条件:
1)DSP电源和地连接正确。
2)DSP时钟正确。
3)DSP的控制信号RS和HOLD信号接高电平。
4)C2000的watchdog关掉。
5)不可屏蔽中断NMI上拉高电平”
按理来说,JTAG口是应该只要DSP工作正常就可以通讯的,所以调调看。首先,时钟设置,clkcmd1、clkcmd2、clkcmd3应该调到最低的工作频率并且支持外接晶体(当初要不是考虑节约成本就不该用晶体,直接用钟振就好了,真是自找麻烦),使用示波器观察clkout输出,没有信号,查spec,看看clkout角默认设置是不是为有时钟输出,对的,但怎么没有信号呢,接晶体脚,已经启振了,好,先不管了,接JTAG口试试,还是不行,怎么回事呢,RS和HOLD都已经接了高电平了,还有NMI也接了高电平,就是不行。。。
DSP开发手记(第二日)(2)
没有办法,再仔细研究DSP的SPEC,
JTAG口应该具有很高的优先级,它可以终止DSP的程序运行,除了NMI不可屏蔽中断以及系统HOLD状态,还有一个,哦,就是检测外扩外设等待状态的READY信号,居然忘了接高电平,上拉后再试JTAG,OK,CCS开起来啦!再将先前试过的上拉电阻直接短接,OK,也没有问题,就是嘛,原来失败的原因只有一个就是忘了将READY信号上拉(导致DSP被挂起,当然也无法响应JTAG口信号),其实上拉电阻的阻值要求根本没有那么高。
总结一下,DSP工作的基本条件是:
1)DSP电源和地连接正确。
2)DSP时钟正确。
3)DSP的控制信号RS和HOLD信号接高电平。
4)C2000的watchdog关掉。
5)不可屏蔽中断NMI上拉高电平
6)READY引脚上拉高电平 (这一项可是被合众达的疑难解答遗忘了的!!)
OK,解决了这个问题心情舒畅多了,试着访问一下内部RAM、CPU控制寄存器都正常:)
不能高兴太早,下一步的事儿还多着呢。赶紧开始写McBSP串口的控制程序,争取尽快把CIS的控制信号搞出来。。。
DSP开发手记(第三日)(1)
今天是周日,效率依然会很高。
早早的,洗完脸赶紧赶到单位,刚刚7点多钟,好的,一个人也没有,清静。
拿出昨晚写完的McBSP控制程序,导入项目,编译、下到TARGET运行,OK,接上示波器观察页同步及时钟同步波形。。。
DSP开发手记(第三日)(2)
在McBSP控制工作允许语句后设置一个断点,运行程序,用示波器观察BCLKR0波形,ok,方波已经有了,再测帧同步BFSR0,没有输出信号:(。检查一下寄存器设置:
SPCR10=0x20、SPCR20=0x200、RCR10=0x2940、RCR20=0x0042、SRGR10=0x0027、SRGR20=0x2fff、PCR0=0x0508,帧同步和时钟同步都已经设置为内部产生并输出了,怎么会没有帧信号输出呢?
先不管了,看看时钟同步信号频率,也不太对呀。。。已经设置了SRGR10=0x0027,也就是说频率应该是系统时钟的1/(39+1)倍,系统时钟是40MHz,也就是说串口同步时钟应该是1M才对。再测一下系统时钟吧,哦,原来如此,是系统时钟频率就已经不对啦。查初始化程序。。。多次试验加上查SPEC,问题终于解决了。。。
我的系统初始化配置程序如下:
PMST = K_PMST; //IPTR=02,MP/MC=1,OVLY=1,AVIS=0,drom=1, clkoff=1,
SWWSR = K_SWWSR; //flash is TWO cycle wait
SWCR = K_SWCR;
BSCR = K_BSCR;
CLKMD = 0x0;//!!!!!!!!!!!
while(CLKMD&0x01);//!!!!!!!!
CLKMD = K_CLKMD; //set clock to 40Mhz
原来在改变系统时钟倍率时,必须先由倍频方式变为降频方式,稳定后才能重新对倍率寄存器赋值,如果想当然地直接对此寄存器赋值则会无效(加!号的两行是我后加的,很重要)。
DSP开发手记(第三日)(3)
板子刚刚好使,要试的东西太多了。
串口帧同步为什么没有呢,不管了,先。
编一小段延时程序,然后控制步进马达启动,编译后下载到目标板,运行,哇,马达跑起来了,还真挺顺利!多次过纸,还好,唯一的不足是没有纸时机械噪音较大,这留着给机械工程师去处理吧,今天就工作到这儿了,留点时间写一下问题总结以及程序流程框图修正。
心得:1。使用C语言编程时,千万不要对状态寄存器(ST0\\ST1)赋值,否则会出现莫名奇妙的问题(甚至连一条最简单的加法语句都会给你算错);
2。使用c语言调用汇编语言写的函数时,形参通过累加器传递到汇编部分,如果函数有返回值,也是通过对累加器赋值实现;
3。设置系统工作频率时,要按照要求先降频,等待时钟锁相环稳定后,再设置寄存器值;
4。DSP的GPIO使用很灵活,原来我一直担心我的直接IO口不够用,其实都是多余的,因为DSP的主机控制接口(通过硬件连接HPIENA脚为低电平置为IO口)以及多功能串口(通过设置寄存器置为IO口)都可以设置为GPIO口,非常灵活。