OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5115|回复: 4

求助CS5523采集1个通道数据正常,采集多个通道数据部正常的问题?

[复制链接]

5

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2012-7-11
在线时间
81 小时
发表于 2014-10-16 14:10:49 | 显示全部楼层 |阅读模式
5金钱
现在用在主程序里面单独采集1个通道,采集AD值都没有问题。
第1-3通道采集的是4-20ma的信号,第4通道采集的是PT100,差分信号。
出现问题:
1、执行Cs5523ReadAdData();采集出来的通道号与AD值无法对应,有时候,第1通道采集的是第二通道的值,有时候是第3通道的值,不定?
2、这4个通道能否一次采集完成?如果可以程序里面应该怎么设置,
///////////////////////////////////////
  //写配置寄存器清RS位,写RS=0以便退出复位模式
   ReadBuffer[0] = 0x05;  //comm=03h* write config_reg         
   ReadBuffer[1] = 0x30; // config=04h,30h,00h        
   ReadBuffer[2] = 0x00;
                               
   RWCR = 0x03;                  
   WriteCommand(RWCR);
   Cs5523WriteData(3);
把配置信息设置成上面的无法实现4个通道一次采集完成。


#include "Global.h" 
#include "CS5523.h"

#define CS5523_CS     PTED_PTED6
#define CS5523_SCLK   PTED_PTED4
#define CS5523_SDI    PTED_PTED7
#define CS5523_SO     PTED_PTED5

#define NOP 

unsigned char  PartSelect = 1;
////////////////cs5532  command/////////////////////////////
unsigned char        RWIOCR ; 
unsigned char        RWIGRR ;  
unsigned char        RWCR ; 
unsigned char        RWCSR ;  
////////////////////
unsigned char    PerformConver ;  //  执行转换
unsigned char    PerformCalib ;  //  执行校准
unsigned char    Sync1 ;         // 串行口重新部分初始化顺序
unsigned char    Sync0 ;         // 串行口结束部分初始化顺序
unsigned char    Null  ;         // 清除口标志,保持系统处于连续的转换模式          
/////////////////////////////////////////////
unsigned char   ReadBuffer[12];
unsigned char   OutRate;
////////////////////////////////////////////


void Delay(void)
{

     Cpu_Delay100US(10000);

void CS5523_Init(void)//初始化端口
{
  // PTED: PTED7=1,PTED6=1,PTED5=1,PTED4=1
  setReg8Bits(PTED, 0xF0);             
  // PTEPE: PTEPE7=1,PTEPE6=1,PTEPE5=1,PTEPE4=1
  setReg8Bits(PTEPE, 0xF0);            
  // PTEDD: PTEDD7=1,PTEDD6=1,PTEDD5=0,PTEDD4=1
  clrSetReg8Bits(PTEDD, 0x20, 0xD0);   
}  

unsigned char SPI_HostReadByte()
{
    unsigned char  i,rByte;
    rByte = 0;    
    for(i=0;i<8;i++)
 {
        CS5523_SCLK = 0;
        CS5523_SCLK = 1;
        rByte <<= 1;
        rByte |= CS5523_SO;
    }
    return rByte;
   
}
///////////////////////////////////
void SPI_HostWriteByte(unsigned char wByte)
{
    unsigned char  i;     
    for(i=0;i<8;i++)
 {
        if(((wByte << i ) & 0x80) == 0x80)
          {
           CS5523_SDI = 1;
          }
        else
          {
           CS5523_SDI = 0;
          }         
        CS5523_SCLK = 0;
        CS5523_SCLK = 1;
    }    
}
 
void WriteCommand(unsigned char Commandcs)
{
 SPI_HostWriteByte(Commandcs);
}

void Read_PressAD(void)
{
 unsigned char i;
 CS5523_SCLK = 0;
 NOP;
 CS5523_CS = 0;
  Cpu_Delay100US(20);
  PerformConver = 0x80 ;//执行通道1 ,采集4-20ma压力值
 SPI_HostWriteByte(PerformConver);
 CS5523_SO = 1;
 while(CS5523_SO == 1);
 erformConver = 0x00;
 SPI_HostWriteByte(PerformConver);
 //Temp=SPI_HostReadByte();
 for (i = 0;i < 3 ;i++)
 {      
    ReadBuffer=SPI_HostReadByte(); 
 } 
 Avq_SamplePress = ReadBuffer[0]*256+ReadBuffer[1];//执行通道1

 CS5523_CS = 1;
}

void Read_TemperatureAD(void)
{
 unsigned char i;
 CS5523_SCLK = 0;
 NOP;
 CS5523_CS = 0;   
 erformConver = 0x88 ;//执行通道2,采集4-20ma温度值
 SPI_HostWriteByte(PerformConver);
 CS5523_SO = 1;
 while(CS5523_SO == 1);
 erformConver = 0x00;
 SPI_HostWriteByte(PerformConver);
 //Temp=SPI_HostReadByte();
 for (i = 0;i < 3 ;i++)
 {      
    ReadBuffer=SPI_HostReadByte(); 
 } 
 Avq_SampleTemperature = ReadBuffer[0]*256+ReadBuffer[1];//执行通道1
 CS5523_CS = 1;
}

void Read_FlowAD(void)
{
 unsigned char i;
 CS5523_SCLK = 0;
 NOP;
 CS5523_CS = 0;   
 erformConver = 0x90 ;//执行通道3-采集4-20ma流量值
 SPI_HostWriteByte(PerformConver);
 CS5523_SO = 1;
 while(CS5523_SO == 1);
 erformConver = 0x00;
 SPI_HostWriteByte(PerformConver);
 //Temp=SPI_HostReadByte();
 for (i = 0;i < 3 ;i++)
 {      
    ReadBuffer=SPI_HostReadByte(); 
 } 
 Avq_SampleFlow = ReadBuffer[0]*256+ReadBuffer[1];//执行通道1
 SPI_HostWriteByte(0x00);
 CS5523_CS = 1;
}


void Read_PT100AD(void)
{
 unsigned char i;
 CS5523_SCLK = 0;
 NOP;
 CS5523_CS = 0;   
 erformConver = 0x98 ;//执行通道4----采集PT100温度值
 SPI_HostWriteByte(PerformConver);
 CS5523_SO = 1;
 while(CS5523_SO == 1);
 erformConver = 0x00;
 SPI_HostWriteByte(PerformConver);
 //Temp=SPI_HostReadByte();
 for (i = 0;i < 3 ;i++)
 {      
    ReadBuffer=SPI_HostReadByte(); 
 } 
 Avq_SamplePT100 = ReadBuffer[0]*256+ReadBuffer[1];//执行通道1
 CS5523_CS = 1;
}
////////////////////////////////////
void Cs5523ReadAdData(void)
{
   Read_PressAD();
   Read_TemperatureAD();
   Read_FlowAD();   
   Read_PT100AD();
}


///////////////////////////////////
void Cs5523WriteData(unsigned char GeShu)
{
 unsigned char i;
 for (i = 0;i < GeShu ;i++)
     {      
      SPI_HostWriteByte(ReadBuffer); 
     }
}

/////////////////////////////////
void CS5523_initialize()
{
  //unsigned char  j;
    unsigned char flag22 = 0;

   unsigned int j;
   CS5523_Init();       
   Delay();//延时500ms
   CS5523_CS = 0;
   for(j=0;j<2047;j++) //延时2048个CS5523_SCLK周期,等待晶振稳定
   {
      CS5523_SCLK = 1;
      CS5523_SCLK = 0;
   }
   //Reset Serial Port
  
   CS5523_SDI = 1;
   for(j=0;j<254;j++) //延时2048个CS5523_SCLK周期,等待晶振稳定
   {
      CS5523_SCLK = 1;
      CS5523_SCLK = 0;
   }
    CS5523_SDI = 0;
    CS5523_SCLK = 1;
    CS5523_SCLK = 0;
  //写配置寄存器置RS位,使复位,复位后RV=1,直到配置寄存器被读取后,RV=0
 RWCR=0x03;// comm=03h* write config_reg
 ReadBuffer[0]=0x00; // config=00h,35h,80h
 ReadBuffer[1]=0x30;
 ReadBuffer[2]=0x80;
 WriteCommand(RWCR);
  Cs5523WriteData(3);
 
  //读配置寄存器
  loop:
 RWCR=0x0b;// comm=0bh* read config_reg
 WriteCommand(RWCR);
  ReadBuffer[0] = SPI_HostReadByte();
  ReadBuffer[1] = SPI_HostReadByte();
  ReadBuffer[2] = SPI_HostReadByte();
 if ((ReadBuffer[2]& 0x40)==0x00) goto loop;//测RV=1,如不为1,则要再读配置寄存器          

///////////////////////////////////////
  //写配置寄存器清RS位,写RS=0以便退出复位模式
   ReadBuffer[0] = 0x00;  //comm=03h* write config_reg         
   ReadBuffer[1] = 0x30; // config=04h,30h,00h        
   ReadBuffer[2] = 0x00;
                               
   RWCR = 0x03;                  
   WriteCommand(RWCR);
   Cs5523WriteData(3);
///////////////////////////////////////
//写配置寄存器,必须重新写一次配置寄存器以便设置配置寄存器的其它位
     ReadBuffer[0] = 0x00;  //comm=03h* write config_reg         
     ReadBuffer[1] = 0x30; // config=04h,30h,00h        
     ReadBuffer[2] = 0x00;
                                 
     RWCR = 0x03;                  
     WriteCommand(RWCR);
     Cs5523WriteData(3);
     //////////////////////
     //delayms(1000);
      Cpu_Delay100US(500);
 
       ReadBuffer[0] = 0x01;   //通道1,速率30.0hz,增益2.5V,单极性
       ReadBuffer[1] = 0xb0;   //通道2,速率30.0hz,增益2.5V,单极性
       ReadBuffer[2] = 0x9b;   //通道3,速率30.0hz,增益2.5V,单极性  
       ReadBuffer[3] = 0x11;   //通道4,速率30.0hz,增益2.5V,双极性
       ReadBuffer[4] = 0xb1;
       ReadBuffer[5] = 0x9a;
      
   
     RWCSR = 0x05;
     WriteCommand(RWCSR);
     Cs5523WriteData(6);     
     //delayms(1000);
      Cpu_Delay100US(500);
 //写配置寄存器,必须重新写一次配置寄存器以便设置配置寄存器的其它位
    
      CS5523_CS = 1;                    

///////////////////////////////////////

 

 

 

 

 

 

 

 

 

 

 

cs5523问题.rar

161.3 KB, 下载次数: 568

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2012-7-11
在线时间
81 小时
 楼主| 发表于 2014-10-16 16:25:49 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-10-16 23:12:47 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2012-7-11
在线时间
81 小时
 楼主| 发表于 2014-10-17 10:34:38 | 显示全部楼层
回复【3楼】正点原子:
--------------------------------
哪位高手用过啊,帮忙看看,着急
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-10-23
在线时间
2 小时
发表于 2019-10-23 19:09:11 | 显示全部楼层
兄弟  你这个调出来了么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表