| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 661 人关注过本帖
标题:求助!STC8A8K单片机读取CS5550AD转换的数据程序
只看楼主 加入收藏
bishejiayou
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2022-7-15
收藏
 问题点数:0 回复次数:0 
求助!STC8A8K单片机读取CS5550AD转换的数据程序
只能观察到SDO出现周期性的单脉冲;

void initialize(void);
void spiwrite_com(unsigned int);
void write_to_register(unsigned int command,unsigned int low,unsigned int mid,unsigned int high);
void write_to_register_int(unsigned int command,unsigned int low,unsigned int mid,unsigned int high);
void read_to_register(unsigned int command,unsigned int low,unsigned int mid,unsigned int high);
void transfer_byte(unsigned int);
void transfer_byte_int(unsigned int);
void Init_Com(void);
     
unsigned char CS5550_RECEIVE_TABLE[3]= {0,0,0};

//从设备SPI设置
sbit CS5550_INT=P3^7;        //外部中断接收位
sbit CS5550_SCLK=P1^5;       //串行时钟输入引脚,确定SDI与SDO的输入输出速率
sbit CS5550_SDO=P2^1;        //串行数据输出引脚
sbit CS5550_CS=P2^3;         //片选位,应在SCLK处于低电平时改变状态
sbit CS5550_SDI=P1^1;        //串行数据输入引脚

void write_to_register(unsigned int command,unsigned int high,unsigned int mid,unsigned int low)  //写寄存器
{
    CS5550_SCLK=0;
    CS5550_CS=0;
    delay();
    transfer_byte_int(command);
    transfer_byte_int(high);
    transfer_byte_int(mid);
    transfer_byte_int(low);
    CS5550_SCLK=0;
    CS5550_CS=1;
}

void write_to_register_int(unsigned int command,unsigned int high,unsigned int mid,unsigned int low)  //防止数据覆盖
{
    CS5550_SCLK=0;
    CS5550_CS=0;
    delay();
    transfer_byte_int(command);
    transfer_byte_int(high);
    transfer_byte_int(mid);
    transfer_byte_int(low);
    CS5550_SCLK=0;
    CS5550_CS=1;
}

void read_to_register(unsigned int command,unsigned int high,unsigned int mid,unsigned int low)  //读寄存器
{
    CS5550_SCLK=0;
    CS5550_CS=0;
    delay();
    transfer_byte(command);
    transfer_byte(high);
    transfer_byte(mid);
    transfer_byte(low);
    CS5550_SCLK=0;
    CS5550_CS=1;
}
 
void transfer_byte_int(unsigned int dat)  //CS5550 SPI接收一个字节数据
{
    unsigned char i;
    CS5550_CS=0;
    delay();
    for(i=0; i<8; i++)
    {
              CS5550_SCLK=0;
        if((dat&0x80)==0)
        {
            CS5550_SDI=0;
        }
        else
        {
            CS5550_SDI=1;
        }
        CS5550_SCLK=1;
        delay();
        CS5550_SCLK=0;
        dat<<=1;
    }
}

void transfer_byte(unsigned int dat)   //CS5550 SPI发送一个字节数据
{
    unsigned char i;
    unsigned char tdata;
    CS5550_CS=0;
    delay();
    for(i=0; i<8; i++)
    {
              CS5550_SCLK=0;
        if( CS5550_SDO == 1)
                    {
                        tdata = tdata|0x01;    // 若接收到的位为1,则数据的最后一位置1
          }
        else
                    {
                tdata = tdata&0xfe;    // 否则数据的最后一位置0
          }        
        CS5550_SCLK=1;
        delay();
        CS5550_SCLK=0;
        dat<<=1;
    }
}

//复位
void initialize()        
{
    unsigned char i=0;
    CS5550_CS=0;
    delay();
    delay();
    spiwrite_com(0xff);
      spiwrite_com(0xff);
        spiwrite_com(0xff);
    spiwrite_com(0xfe);    //串口复位
    spiwrite_com(0x80);    //软件复位
    CS5550_SDI=0;
    CS5550_SDO=1;
    CS5550_SCLK=0;
}
 
//串口初始化
void Init_Com()
{
    TMOD=0X20;
    TH1=0xfd;
    TL1=0xfd;
    PCON=0x00;       //波特率不增倍
    TR1=1;           //启动定时器
    SCON=0x50;       //串行口1工作方式为方式1,允许串行接收
      S2CON=0x40;      //串行口2工作方式0,允许接收
}
 
//寄存器写命令
void spiwrite_com(unsigned int Input)
{
    CS5550_SCLK=0;
    CS5550_CS=0;
    delay();
    transfer_byte_int(Input);
    CS5550_SCLK=0;
    CS5550_CS=1;
}

void result()         //模拟转换量读取
{
    unsigned char a,b,n;
    CS5550_SCLK=0;
    CS5550_CS=0;
    write_to_register(0x5e,0xff,0xff,0xfe);          //清状态寄存器
    transfer_byte_int(0x07);                         //读输出寄存器1
     // transfer_byte_int(0x08);                       //读输出寄存器2
    for(a=0; a<3; a++)
    {
        for(b=0; b<8; b++)        //经过8个周期的if&else循环判断处理,CS5550_RECEIVE_TABLE[]最后存储了主机sbuff的一字节数据
        {
            CS5550_RECEIVE_TABLE[a]<<=1;
            if(CS5550_SDO)                  
                CS5550_RECEIVE_TABLE[a]|=0x01;
            else                             
                CS5550_RECEIVE_TABLE[a]&=0xfe;
            CS5550_SCLK=1;
            delay();
            CS5550_SCLK=0;
            if((b+1)%8==0)
            {
                CS5550_SDI=0;
            }
            else
            {
                CS5550_SDI=1;
            }
            delay();
        }
             transfer_byte(CS5550_RECEIVE_TABLE[a]);    //向单片机发送8位数据,3个a周期下来便是发送3字节共24位数据
       CS5550_SCLK=0;
       CS5550_CS=1;
       for(n=0; n<100; n++);
    }
}

void main()
{
    initialize();                          //复位
    write_to_register(0x40,0x00,0x00,0x1f);//写配置寄存器(增益为10,中断信号INT方式为低电平有效,AIN1、2通道高速滤波器被禁止,CPUCLK驱动上升沿逻辑时,使噪声最小,内部时钟频率DCLK=MCLK,K=1
    write_to_register(0x5e,0xff,0xff,0xfe);//清状态寄存器(向状态寄存器24位宽全部写入1使所有位都变成0,最后一位IC位的设置对整个芯片的工作影响不大,所以可改可不改)
    write_to_register(0x74,0x80,0x00,0x00);//写屏蔽寄存器(首位置1表示数据就绪,校准序列已经完成,其他置零)
    write_to_register(0x4a,0x00,0x00,0x10);//写周期计数寄存器(N=2^4=16)
    Init_Com();                            //初始化串口
      spiwrite_com(0xc8);                    //校准
    transfer_byte(0xe0);                   //开始转换(0xE8:连续转换;0xE0:单转换)
      result();                              //模拟转换量读取
      oled();                                //外部oled显示
}
搜索更多相关主题的帖子: void 寄存器 unsigned delay int 
2022-07-15 16:55
快速回复:求助!STC8A8K单片机读取CS5550AD转换的数据程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018482 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved