打印

求助:C8051F020单片机下CS5532驱动问题

[复制链接]
2122|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
卖萌的路飞|  楼主 | 2012-12-19 13:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我照着网上的驱动写的程序,但是有很多问题,中断调试老是在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();
    }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

0

帖子

0

粉丝