1、199第 9 章 串行外设接口模块(SPI)9.4.2 软件设计2 MAX5121 与 DSP 的 SPI 软件实现源程序代码:(1)所需的复位和中断向量定义文件“vectors.asm”/ 该文件利用汇编语言代码定义了复位和中断向量 .title “vectors.asm“.ref _c_int0,_nothing.sect “.vectors“reset: b _c_int0int1: b _nothingint2: b _nothingint3: b _nothingint4: b _nothingint5: b _nothingint6: b _nothing(2)主程序/该程序利用
2、LF2407 的 SPI 模块向 MAX5121 芯片发送数据用于 D/A 转换,MAX5121 的模拟输出端输出一个三角波 /用 C 语言编写 #include “register.h“int GPR3;int flag1; int flag;/系统初始化子程序 int initial()asm(“ setc INTM“); /屏蔽中断 WSGR=0X00; /禁止所有的等待状态 asm(“ CLRC SXM“);asm(“ CLRC OVM“);asm(“ CLRC CNF“); /B0 被配置为数据空间 *SCSR1=0X81FE; /CLKIN=6M,CLKOUT=24M ,并且使能到
3、 SPI 模块的时钟 *WDCR=0X0E8; /不使能看门狗 200/SPI 模块初始化子程序 int SPIINITIAL()*SPICCR=0X004F; /16 char bits ,在 SPICLK 的下降沿发送数据,与 MAX5121 在/上升沿接收数据配合 *SPICTL=0X0006; /使能主动模式,一般的时钟方式,使能 TALK *SPIBRR=0X0007; /SPI 的波特率为 3M,CLKOUT=24M *MCRB=0X003C; /设置通用引脚为 SPI 功能的引脚 *MCRC=*MCRC&0X0FFFE; /设置 IOPE0 脚为通用引脚 *SPICCR=*SPI
4、CCR|0X0080; /使 SPI 退出复位状态 /SPI 发送数据子程序,需要发送的数据存放在 GPR3 寄存器中 int SPITRANS()*PEDATDIR=(*PEDATDIR|0X0100)&0X0FFFE;/设置 IOPE0 为输出,且输出低电平, /以选中 MAX5121 芯片 *SPITXBUF=GPR3; /向 SPI 的发送缓冲器写一个发送数据 while(1)flag=*SPISTS&0x40; /flag=SPI 的中断标志 if(flag=0x40) break; /如果 SPI 的中断标志的中断标志为 1,则证 /明 SPI 已经发送成功,则停止等待 *SPIR
5、XBUF=*SPIRXBUF; /虚读 SPIRXBUF 寄存器,以清除 SPI 中断标志 *PEDATDIR=*PEDATDIR|0x01; /发送完毕,则 IOPE0 输出高,使发送的数据输 /出到 MAX5121 的输入寄存器和 DAC 寄存器中 /主程序 main()initial(); /系统初始化 SPIINITIAL(); /SPI 初始化 GPR3=0x4000; /根据 MAX5121 的格式写一个数据,使其输出的模 /拟量为 0,具体的数据格式请参照表 9.5 flag1=0x00; /三角波上升沿、下降沿标志,当 flag1=0 时,为上 /升沿,当 flag1=1 时,
6、为下降沿 while(1)201if(flag1=0x00) GPR3=GPR3+2; /因为数据从倒数第 2 位开始,故要使数据加 1,则 /需要在实际的寄存器中加 2,此操作对应三角波的 /上升沿 else GPR3=GPR3-2; /因为数据从倒数第 2 位开始,故要使数据减 1,则 /需要在实际的寄存器中减 2,此操作对应三角波的 /下降沿 if(GPR3=0x5FFE) flag1=0x01; /若需要转换的数据到 FFFH,则开始下降沿 if(GPR3=0x4000) flag1=0x00; /若需要转换的数据到 00H,则开始上升沿 SPITRANS(); /调用 SPI 发送数据子程序 /当发生干扰中断时,执行此中断服务程序 void interrupt nothing()return;