我在用DSP2407的SPI和TLC2543做一个通讯,用SPI向TLC2543发送控制字,TLC2543采集的结果返回给DSP。但是不知道为什么,SPI模块时钟SPICLK脉冲信号都检测不到,本来调试过一次,有信号了的,但是习惯不好,没有备份,一修改,自己也不知道了。我将SPI具体通讯这一块的源程序给出来,大家帮忙看一下,指出问题,不尽感谢。<br /><br />/************************************************************************<br /> 延时程序<br />*************************************************************************/<br />void delay(int j)<br />{ <br /> unsigned int i;<br /> for(i=0;i<j;i++)<br /> {<br /> asm( " NOP " );<br /> }<br />}<br /><br /><br />/************************************************************************<br /> 系统初始化程序<br />*************************************************************************/<br />void SYSinitial(void) <br />{<br /> asm(" setc SXM"); // 抑制符号位扩展<br /> asm(" clrc OVM"); // 累加器中结果正常溢出<br /> asm(" clrc CNF"); // B0被配置为数据存储空间<br /> asm(" setc INTM"); // 禁止所有中断<br /> *SCSR1 = 0x8FFE; // BIT11,10,9使锁相环0.5倍频,则CLOCKOUT=0.5*时钟频率=10M<br /> // BIT5使能SPI模块时钟,还使能了ADC,SCI,CAN,EVB EVA时钟<br /> *WDCR = 0x00E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE<br /> // 可以用软件禁止看门狗<br /> *IMR = 0x0000; // 禁止所有中断<br /> *IFR = 0xFFFF; // 清除全部中断标志"写1清0"<br />}<br /><br /><br />/************************************************************************<br /> IO初始化程序<br />*************************************************************************/<br />void IOinitial(void)<br />{<br /> *MCRA = *MCRA & 0x0000; //将IOPA和IOPB设置成为通用IO口(这个是准备用来做电子矩阵开关的)<br /> *MCRC = *MCRC | 0xFFFF; //将IOPE1和IOPE2设置成为通用IO口(做电子矩阵开关)<br /> *MCRC = *MCRC & 0xF5F9; //将IOPE1,2和IOPF1,3设置为通用IO口<br /> //IOPF3测试电子开关,IOPF1设置TLC2543的转换电平EOC<br /> //这个EOC到底要不要设置,我看了下TLC2543的资料,好像不需要设置啊<br /> *MCRB = *MCRB | 0xFFFF;<br /> *MCRB = *MCRB & 0xFFDF; //BIT2设置SPISIMO,BIT3设置SPISOMI,BIT4设置SPICLK<br /> //BIT5设置/SPISTE,即IOPC5为普通IO口(这儿用来作片选,连接到TLC2543的IOCLK引脚上去了的 <br />} <br /> <br /><br />/************************************************************************<br /> SPI初始化程序<br />*************************************************************************/<br />void SPIinitial(void)<br />{<br /> *PCDATDIR = *PCDATDIR | 0xFF00; //设置IOPC5为输出方式<br /> *SPICCR = 0x000F; //BIT7设置SPI软件复位,BIT6设置SPICLK信号下降沿时,数据输出;<br /> //上升沿时,数据输入。当没有SPI数据发送时,SPICLK处于高电平<br /> //BIT3,2,1,0设置字符长度为16位<br /> *SPICTL = 0x000E; //BIT4禁止超限中断,BIT3设置SPICLK信号延时半个周期,BIT2设置<br /> //SPI配置为一个主模式,BIT1使能发送位,BIT0禁止中断<br /> *SPIBRR = 0x0007; //波特率设置为SPI波特率=CLOCKOUT/(1+SPIBRR)=1.25M<br /> *SPICCR = *SPICCR | 0x80; //准备好发送或接收下一个字符<br /> *PCDATDIR = *PCDATDIR & 0xFFDF; //输出一个低电平,片选TLC2543<br />}<br /><br /><br />/************************************************************************<br /> TLC2543和SPI通讯程序<br />*************************************************************************/<br /><br />//SPI发送程序<br />void SPIsend(unsigned int a)<br />{<br /> *SPITXBUF = a;<br /> while((*SPISTS) & BIT6 == 0x00); //这里的BIT6用了宏定义,为0x0009<br /> *SPIRXBUF = *SPIRXBUF; //虚读接收缓冲器请除SPI中断标志位<br />}<br /><br />//AD转换程序<br />unsigned int AD_start(unsigned int channel)<br />{<br /> delay(30);<br /> SPIsend(((channel << 12) & 0xF000) | 0x0C00);<br /> delay(30);<br /> SPIsend(0x0000);<br /> delay(30);<br /> return(*SPIRXBUF >> 4);<br /> *PCDATDIR = *PCDATDIR | 0x0020;<br /> //SPI从最高位开始接收数据,高12位数据收满后右移四位将低四位无用的数移除<br />}<br /><br />我在主函数里面用数组保存调用了AD_start()的值,由于用的是TLC2543的第一个通道,所以参量为0x0000;<br />在程序load以后调试时,发现没有SPICLK时钟信号,这个很郁闷。也就是说这个SPI模块连时钟脉冲都没有出来,看了帖子说要发送以后才会有时钟出来,我也调试了,但是还是不行。有关于SPI的程序我都摆在上面了,希望哪位朋友可以帮忙指点一下,因为涉及到得寄存器定义比较多,我想认真看的话估计时间是要花点的,如果能够给以帮助的话,不尽感谢。<br />我的QQ是297156721,电子邮箱是:liusir61094313@163.com. 本人是学生,才开始接触DSP,做一点事情,感到很棘手了,呵呵,向高手们学习! |
|