📄 max5121与dsp的spi软件实现.txt
字号:
源程序代码:
(1)所需的复位和中断向量定义文件“vectors.asm”
// 该文件利用汇编语言代码定义了复位和中断向量
.title "vectors.asm"
.ref _c_int0,_nothing
.sect ".vectors"
reset: b _c_int0
int1: b _nothing
int2: b _nothing
int3: b _nothing
int4: b _nothing
int5: b _nothing
int6: b _nothing
(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 ,并且使能到SPI模块的时钟
*WDCR=0X0E8; //不使能看门狗
}
//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=*SPICCR|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已经发送成功,则停止等待
}
*SPIRXBUF=*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时,为下降沿
while(1)
{
if(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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -