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