打印
[国产单片机]

STC单片机模拟SPI读取cs5532

[复制链接]
8410|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heihei526|  楼主 | 2011-9-11 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下代码的运行环境是33M的晶振,51单片机(4个机器周期为一个指令周期的高速结构),之后我换成了STC12c5A48S2单片机(是普通51的8~12倍速度),22.1184M晶振,直接将下面的代码引脚改动一下,运行后初始化虽然过去但是有问题(*注1),读到的AD码始终是很大值,而且不随传感器变化而变化,我该怎么调试才可以初始化成功并能读到正确AD码呢?

typedef union UCharIntLong{
   unsigned char uc[4];
   unsigned int  ui[2];
   unsigned long ul;
  }UCIL;
sbit ADO=P3^3;
sbit ADI=P3^2;
sbit ADCLK=P3^4;
#define NOP _nop_();
/***********************************************************************
函 数 名:void InitAd(void)
***********************************************************************/
void InitAd(void)
{
uchar i;
UCIL temp;
ulong adconvtime=0;

ADCLK=0;

//延时50ms
delay_1ms(50);

for(i=0;i<15;i++)
{
  write5532(0xff);
}
write5532(0xfe);
ADCLK=0;
temp.ul=0x22080000;
write5532(0X03);
for(i=0;i<4;i++)
{
  write5532(temp.uc[i]);
}
ADCLK=0;
do{
  delay_1ms(1);
  write5532(0x0b);
  temp.uc[0]=read5532();
  if((++adconvtime)>=1000)
   error();
}
while(!(temp.uc[0]&0x10)); //这里temp.uc[0] 始终是全1---*注1
ADCLK=0;
NOP;NOP;NOP;
temp.ul=0x00000000;
write5532(0x01);  
for(i=0;i<4;i++)
{
  write5532(temp.uc[i]);
}
ADCLK=0;
NOP;NOP;NOP;
temp.ul=0x01000000;
write5532(0x02);  
for(i=0;i<4;i++)
{
    write5532(temp.uc[i]);
}
ADCLK=0;
NOP;NOP;NOP;
temp.ul=0x02000000;   
write5532(0X03);   
for(i=0;i<4;i++)
{
  write5532(temp.uc[i]);
}
ADCLK=0;
temp.ul=0x00400040;
write5532(05);   
for(i=0;i<4;i++)
{
  write5532(temp.uc[i]);
}
ADCLK=0;
NOP;NOP;NOP;
write5532(0xC0);  
NOP;NOP;NOP;
ADCLK=0;
    delay_1ms(20);   
}
/***********************************************************************
函 数 名:uchar read5532(void)
***********************************************************************/
uchar read5532(void)
{
uchar i,indata=0;
for(i=0;i<8;i++)
{
  indata<<=1;
  if(ADO) indata|=0x01;
  else    indata&=0xff;
  
  ADCLK=1;
  NOP;
  NOP;
  NOP;
  ADCLK=0;
  NOP;
  NOP;
}
return(indata);
}
/***********************************************************************
函 数 名:uchar read5532(void)
***********************************************************************/
void write5532(uchar outdata)
{
uchar i;
for(i=0;i<8;i++)
{
  ADI=outdata&0x80;
  NOP;
  ADCLK=1;     //上升沿写入
  NOP;
  outdata<<=1;   //左移,高位在前
  ADCLK=0;     //CLOCK
  NOP;
}
}

/***********************************************************************
函 数 名:uchar read5532(void)
***********************************************************************/
ulong ReadAd(void)
{
    UCIL data adtemp;

write5532(0);
adtemp.uc[1]=read5532();  //最高字节
adtemp.uc[2]=read5532();
adtemp.uc[3]=read5532();
adtemp.uc[0]=read5532();
adtemp.uc[0]=0;
adtemp.ul>>=5;  //19位ad读取
return(adtemp.ul);
}

相关帖子

沙发
airwill| | 2011-9-26 15:36 | 只看该作者
你没有看到, cs5532有个 CS 信号,
仔细看一下, cs 置低才能进行数据传递,
你的程序好象没有处理 CS 信号

使用特权

评论回复
板凳
hanweng| | 2011-10-9 15:51 | 只看该作者
我也在困扰中啊,问题解决没有??????

使用特权

评论回复
地板
vcxz_1982| | 2012-3-12 13:43 | 只看该作者
貌似应当

adtemp.ul>>=8;  //19位ad读取  CS5532是24位的. 32个数据位, 要去掉末尾8位, 那8个是做标志, 看手册.
return(adtemp.ul);

使用特权

评论回复
5
poopghgmnn| | 2012-4-18 17:21 | 只看该作者
最近也要搞CS5532   能发一份驱动程序来学习下吗  我用的是飞思卡尔芯片  我的QQ是397640696  发邮箱也可以压

使用特权

评论回复
6
poopghgmnn| | 2012-4-18 17:21 | 只看该作者
最近也要搞CS5532   能发一份驱动程序来学习下吗  我用的是飞思卡尔芯片  我的QQ是397640696  发邮箱也可以压

使用特权

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

本版积分规则

0

主题

2

帖子

1

粉丝