以下是我照着网上的驱动写的程序,但是有很多问题,中断调试老是在unsigned char RecSPIByte(void)中死循环,被人新手实在不会弄了,请大神们帮忙
#include <c8051f020.h>
#include <intrins.h>
sbit NSS0=P3^0; //片选端在P3.0端口
#define CS5532_SELECT NSS0=0 // CS5532片选开
#define CS5532_NOSELECT NSS0=1 // CS5532片选关
#define VRS 0x02 //参考电压选择(Ref>2.5V,VRS=0)
//延时
void delay_ms(unsigned int x)
{
unsigned int y;
while(x!=0)
{
x--;
for(y=0;y<=1106;y++); //对于11.0592Mhz的晶振,1106延时0.1MS
}
}
//向cs5532写一个字节
void SendSPIByte(unsigned char ch)
{
SPIF = 0;
SPI0DAT = ch;
while (0==SPIF); // 等待写结束
SPIF = 0;
}
//cs5532向单片机发一个字节
unsigned char RecSPIByte(void)
{
unsigned char ch;
ch=0;
SPIF=0;
ch=SPI0DAT;
while(0==SPIF);
SPIF=0;
return(ch);
}
//cs5532复位
void CS5532Reset(void)
{
unsigned int i,rec;
CS5532_SELECT;
for(i=0;i<15;i++) /*纵向引伸计5532初始化序列*/
{
SendSPIByte(0xff);
}
SendSPIByte(0xfe);
SendSPIByte(0x03); /*纵向引伸计5532系统复位,RS=1,写配置寄存器*/
SendSPIByte(0x20);
SendSPIByte(0x00);
SendSPIByte(0x00);
SendSPIByte(0x00);
while(rec!=0x10) //等待复位(RV=1)完成,
{
SendSPIByte(0x0b); //读配置寄存器,直到bit RV=1
rec=RecSPIByte();
SendSPIByte(0x00);
SendSPIByte(0x00);
SendSPIByte(0x00);
}
// CS5532_NOSELECT;
}
//CS5532初始化
void CS5532_init(void)
{
delay_ms(300);
CS5532Reset();
// CS5532_SELECT;
//设置配置寄存器
delay_ms(300);
SendSPIByte(0x03); //配置寄存器命令字
SendSPIByte(0x00); //正常模式 2.5V<VREF<=VA+ VRA=0
SendSPIByte(0x00);
SendSPIByte(0x00);
SendSPIByte(0x00);
//设置通道寄存器
delay_ms(300);
SendSPIByte(0x05); //通道寄存器命令字
SendSPIByte(0x02); //VRS=0 A=2; VRS=1 A=1;
SendSPIByte(0x00); //单极性模式、物理通道1、1倍增益单极性增益范围[(VREF+ - VREF-)]/1*A
SendSPIByte(0x00); //7.5Hz字速率 执行转换 只是用于连续转换模式?
SendSPIByte(0x00);
/*
//设置增益寄存器
delay_ms(300);
SendSPIByte(0x02); //增益寄存器命令字
SendSPIByte(0x01); //自增益 增益1.0
SendSPIByte(0x00);
SendSPIByte(0x00);
SendSPIByte(0x00);
//设置偏移寄存器
delay_ms(300);
SendSPIByte(0x01); //偏移寄存器命令字
SendSPIByte(0x00); //自偏移 偏移0.0
SendSPIByte(0x00);
SendSPIByte(0x00);
SendSPIByte(0x00);
*/
SendSPIByte(0x81); //自偏移
SendSPIByte(0x82);//自增益
//发送单词转换命令
// SendSPIByte(0x80);
//发送连续转换命令
// SendSPIByte(0xc0);
}
//切换到外部晶振11.0592MHZ
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x08;
}
unsigned char rec[4];
unsigned int i;
void main (void)
{
WDTCN = 0xde;
WDTCN = 0xad;
XBR0 = 0xDe;//UART0,SPI,SMBus连到端口
XBR1 = 0x04;//INT0连到端口
XBR2 = 0x40;//弱上拉允许,交叉开关允许,UART1连到端口
//SPI设定
SPI0CFG=0x07; //SCK第2个边沿采样,在空闲时处于低电平,贞长度8
SPI0CN= 0x03;
// MSTEN=1; //SPI主方式操作
// SPIEN=1; //SPI允许
SPI0CKR=0x02; //SPI时钟Fsck=(11.0592/2)/3=1.8342MHz
P0MDOUT = 0xf5;//P0口配置,各个端口输入时配置为漏极开路,输出时配置为推挽方式
P1MDOUT = 0x31;//P1口配置
P2MDOUT = 0xdd;//P2口配置
P3MDOUT = 0x5f;
P74OUT = 0xfc;//P7-4口配置
Oscillator_Init();
for(i=0;i<4;i++)
{
rec[i]=0;
}
CS5532_init();
while(1)
{
SendSPIByte(0x80); //单次转换
delay_ms(200);
while(SPI0DAT==1); //等待SDO从1变成0
SendSPIByte(0x00); //清除SDO flag
rec[0]=RecSPIByte(); //读取32bit数据 高位在前
rec[1]=RecSPIByte();
rec[2]=RecSPIByte();
rec[3]=RecSPIByte();
}
} |