打印
[测量]

cs5530读到的数据全是FF

[复制链接]
4975|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lovezichao|  楼主 | 2022-3-1 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lovezichao 于 2022-3-1 10:35 编辑

使用的STM32L051C8T6的单片机。程序代码如下,用串口发出来的AD值全是FF。请大神进来看下,代码哪里有问题。

.H文件:
#include "stdint.h"

#define CMD_CS30_READ_OFFSET_REG        ((1 << 3) | (1 << 0))
#define CMD_CS30_WRITE_OFFSET_REG      ((0 << 3) | (1 << 0))
                                                                                                                                                                        
#define CMD_CS30_READ_GAIN_REG           ((1 << 3) | (1 << 1))
#define CMD_CS30_WRITE_GAIN_REG         ((0 << 3) | (1 << 1))
                                                                                                                                                                        
#define CMD_CS30_READ_CFG_REG             ((1 << 3) | (3 << 0))
#define CMD_CS30_WRITE_CFG_REG           ((0 << 3) | (3 << 0))

#define CMD_CS30_SINGLE_CONVER            ((1 << 7) | (0 << 6))
#define CMD_CS30_CONTINUOUS_CONVER       ((1 << 7) | (1 << 6))

#define CMD_CS30_SYS_OFFSET_CALIB       0x85
#define CMD_CS30_SYS_GAIN_CALIB           0x86


#define CFG_BIT_RS_CS30                (1 << 29)
#define CFG_BIT_RV_CS30                (1 << 28)
#define CFG_BIT_FRS_CS30               (1 << 19)

#define CFG_VRS_25UP_CS30            (0x00 << 25)                //2.5V < Vref <= VA+ - VA-
#define CFG_VRS_25LS_CS30            (0x01 << 25)                //1V <= Vref <= 2.5V

#define CFG_B_POLAR_CS30             (0x00 << 10)               
#define CFG_U_POLAR_CS30             (0x01 << 10)               

#define WR_CS30_120                 (0x00 << 11)
#define WR_CS30_60                   (0x01 << 11)
#define WR_CS30_30                   (0x02 << 11)
#define WR_CS30_15                   (0x03 << 11)
#define WR_CS30_7p5                 (0x04 << 11)
#define WR_CS30_3840               (0x08 << 11)
#define WR_CS30_1920               (0x09 << 11)
#define WR_CS30_960                 (0x0A << 11)
#define WR_CS30_480                 (0x0B << 11)
#define WR_CS30_240                 (0x0C << 11)


void CS5530_Write_Byte(unsigned char dat);
void CS5530_Read_Data(void);
void CS5530_Sample(void);
void CS5530_Init(void);
void CS5530_Read(uint8_t* Buf, uint32_t len);
int32_t CS5530_ReadADC_Data(void);
void CS5530_Read(uint8_t* Buf, uint32_t len);
.C文件:

#include "stm32l0xx_hal.h"
#include "cs5530.h"
#include "stm32l0xx_hal_spi.h"
#include "main.h"
#include "string.h "

#define _SPI_DELAY_    50                //
#define SPI_CS(x)       (x?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET))      
#define SPI_CLK(x)      (x?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET))      
#define SPI_MOSI(x)     (x?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET))      
#define SPI_MISO        HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)     

void SPI_Delay(uint16_t del){
      
  while(del--){
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
  }
}

uint8_t SPI_Write_Read_Byte(uint8_t TX_Dat){
        uint8_t i;
        uint8_t RX_Dat = 0;
  
        for(i = 0; i < 8; i++){
   
                if(TX_Dat & 0x80){
                        SPI_MOSI(1);
                } else {
                        SPI_MOSI(0);
                }
    TX_Dat <<= 1;
   
    SPI_CLK(1);
    SPI_Delay(_SPI_DELAY_);
   
    RX_Dat <<= 1;
                if(SPI_MISO != 0){
                        RX_Dat |= 0x01;
                }
   
    SPI_CLK(0);
    SPI_Delay(_SPI_DELAY_);
        }  

        return RX_Dat;
}

static void CS5530_Send(uint8_t* data, uint32_t len){
        uint32_t i;

        for(i = 0; i < len; i++){
                SPI_Write_Read_Byte(data);
        }
}

static void CS5530_Read(uint8_t* Buf, uint32_t len){
        uint32_t i;
   
        for(i = 0; i < len; i++){
                Buf = SPI_Write_Read_Byte(0x00);
        }
}

static uint8_t CS30_CMD_BUF[20];

#define SYNC_LEN 18
static void CS5530_Sync(void){
        memset(CS30_CMD_BUF,0xff,SYNC_LEN);
        CS30_CMD_BUF[SYNC_LEN - 1] = 0xfe;
        CS5530_Send(CS30_CMD_BUF,SYNC_LEN);
}

static void CS5530_WriteResByCmd(uint32_t cmd,uint32_t res){
        CS30_CMD_BUF[0] = cmd;
        CS30_CMD_BUF[1] = res >> 24;
  CS30_CMD_BUF[2] = res >> 16;
  CS30_CMD_BUF[3] = res >> 8;
  CS30_CMD_BUF[4] = res;
      
        CS5530_Send(CS30_CMD_BUF,5);
}

static uint32_t CS5530_ReadResByCmd(uint32_t cmd){
        CS30_CMD_BUF[0] = cmd;

        CS5530_Send(CS30_CMD_BUF,1);
        CS5530_Read(&CS30_CMD_BUF[1],4);
      
        return (uint32_t)((CS30_CMD_BUF[1] << 24) | (CS30_CMD_BUF[2] << 16) | (CS30_CMD_BUF[3] << 8) | CS30_CMD_BUF[4]);
}

static void CS5530_Reset(void){
        //Read Cfg , clear RV bit
        CS5530_ReadResByCmd(CMD_CS30_WRITE_CFG_REG);
      
        //write RS bit to 1, wait 8 master clock sycles wirte RS back to 0.
        CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, CFG_BIT_RS_CS30);
//        osDelay(pdMS_TO_TICKS(5));
        SPI_Delay(10);
        CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, 0);
      
        while(!(CS5530_ReadResByCmd(CMD_CS30_WRITE_CFG_REG) & CFG_BIT_RV_CS30)){
//                osDelay(pdMS_TO_TICKS(5));
                SPI_Delay(100);
        }

        CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, 0);
}

static void CS5530_Start(uint32_t type){
        CS30_CMD_BUF[0] = type;
  CS5530_Send(CS30_CMD_BUF,1);
}

static uint32_t cfgResCS30 = 0;

void CS5530_Init(){
        SPI_CS(0);  
        CS5530_Sync();
        CS5530_Reset();
      
        cfgResCS30 = CFG_VRS_25LS_CS30 | WR_CS30_240 | CFG_U_POLAR_CS30;// | CFG_BIT_FRS_CS30;
        CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, cfgResCS30);
      
  HAL_Delay(5);

        CS5530_Start(CMD_CS30_CONTINUOUS_CONVER);//
        SPI_CS(1);
}

int32_t CS5530_ReadADC_Data() {
        int32_t adcCode = 0;
      
  memset(CS30_CMD_BUF, 0x00, 5);
      
        SPI_CS(0);
  CS5530_Read(CS30_CMD_BUF, 5);
        SPI_CS(1);
  
        adcCode = (CS30_CMD_BUF[1] << 24) | (CS30_CMD_BUF[2] << 16) | (CS30_CMD_BUF[3] << 8) | CS30_CMD_BUF[4];
  
  return adcCode;
}


使用特权

评论回复
沙发
lovezichao|  楼主 | 2022-3-1 17:11 | 只看该作者
虽然没有人回复,但是这个问题解决了,现在把解决后的代码附上,后面如果有人再遇见类似问题,可以参考。
#include "stm32l0xx_hal.h"
#include "CS5530-test.h"
#include "main.h"

#define _SPI_DELAY_                50                //
#define SPI_CS(x)       (x?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET))      
#define SPI_CLK(x)      (x?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET))      
#define SPI_MOSI(x)     (x?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET))      
#define SPI_MISO        HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)     

void SPI_Delay(uint16_t del){
       
  while(del--){
    __NOP();
    __NOP();
    __NOP();
    __NOP();
    __NOP();
  }
}

void Write_Cs5530_Byte(uint8_t TX_Data){
       
        uint8_t loop;
        SPI_CLK(0);

        for(loop = 0; loop < 8; loop++){
               
                if(TX_Data & 0x80){
                        SPI_MOSI(1);
                } else {
                        SPI_MOSI(0);
                }
    TX_Data <<= 1;
    SPI_CLK(1);
                SPI_Delay(_SPI_DELAY_);
                SPI_CLK(0);
                SPI_Delay(_SPI_DELAY_);
        }
}

uint8_t Read_Cs5530_Byte(void){
        uint8_t loop,RX_Data;
        SPI_CLK(0);
        for(loop = 0; loop < 8; loop++){
                RX_Data <<= 1;
    if(SPI_MISO){
      RX_Data |= 0x01;
                }
   
                SPI_CLK(0);
                SPI_Delay(_SPI_DELAY_);
                SPI_CLK(1);
                SPI_Delay(_SPI_DELAY_);
        }
       
        return RX_Data;
}

void Write_Cs5530_DWord(uint8_t* data, uint8_t len){
  
  uint32_t i;

        for(i = 0; i < len; i++){
                Write_Cs5530_Byte(data[i]);
        }
}

static uint8_t CS30_CMD_BUF[5];

static void CS5530_WriteResByCmd(uint32_t cmd,uint32_t res){
        CS30_CMD_BUF[0] = cmd;
        CS30_CMD_BUF[1] = res >> 24;
  CS30_CMD_BUF[2] = res >> 16;
  CS30_CMD_BUF[3] = res >> 8;
  CS30_CMD_BUF[4] = res;
       
        Write_Cs5530_DWord(CS30_CMD_BUF,5);
}

int32_t Read_Cs5530_AD(void){
        uint8_t loop;
        uint32_t da;
       
        SPI_CLK(0);
  SPI_CS(0);
        SPI_Delay(_SPI_DELAY_);
  
//        while(SPI_MISO);
       
        Write_Cs5530_Byte(NULL_BYTE);//发送8个NULL数据清到SDI引脚,清SDO数据
        for(loop = 0; loop < 32; loop++){
                da <<= 1;
   
    if(SPI_MISO){
      da |= 0x01;
    }

                SPI_CLK(1);
                SPI_Delay(_SPI_DELAY_);
                SPI_CLK(0);
                SPI_Delay(_SPI_DELAY_);
        }
        da >>= 14;
  
  SPI_CS(1);
        return da;
}

void cs5530_init(void){
        uint8_t loop;
  
  HAL_Delay(20);
        SPI_MOSI(0);
        SPI_CLK(0);
  SPI_CS(0);
       
  //发送至少15个0xff,一个0xfe
        for(loop = 0; loop < 30; loop++){
                Write_Cs5530_Byte(SYNC1);
        }
        Write_Cs5530_Byte(SYNC0);
       
//        Write_Cs5530_Byte(CMD_WRITE + REG_CONFIG);//写配置寄存器
        CS5530_WriteResByCmd(CMD_WRITE + REG_CONFIG,SYSTEM_RESET);//写复位指令
        HAL_Delay(20);
        CS5530_WriteResByCmd(CMD_WRITE + REG_CONFIG,0);//写复位指令
  
  //
  
//        Write_Cs5530_Byte(CMD_WRITE + REG_CONFIG);
        CS5530_WriteResByCmd(CMD_WRITE + REG_CONFIG,VREF_HIGH | DATARATE_12P5 | UNIPOLAR_MODE);//正常操作,FRS = 0,速度15sps,单极性模式
        Write_Cs5530_Byte(NORMAL_CONVERSION + START_CONTINUOUS);
  
  SPI_CS(1);
}

使用特权

评论回复
板凳
目中无神| | 2022-3-27 17:04 | 只看该作者
CS5530 问题解决了吗?  QQ 979353574

使用特权

评论回复
地板
目中无神| | 2022-3-27 18:03 | 只看该作者
lovezichao 发表于 2022-3-1 17:11
虽然没有人回复,但是这个问题解决了,现在把解决后的代码附上,后面如果有人再遇见类似问题,可以参考。
...

很好 很好 就是我的不好用!

使用特权

评论回复
5
目中无神| | 2022-3-27 18:05 | 只看该作者
lovezichao 发表于 2022-3-1 17:11
虽然没有人回复,但是这个问题解决了,现在把解决后的代码附上,后面如果有人再遇见类似问题,可以参考。
...

帮助一下 QQ 979353574 谢谢!

使用特权

评论回复
6
lovezichao|  楼主 | 2022-3-31 17:16 | 只看该作者
目中无神 发表于 2022-3-27 18:05
帮助一下 QQ 979353574 谢谢!

解决没?可以检查一下时序延时。

使用特权

评论回复
7
目中无神| | 2022-4-2 14:28 | 只看该作者
好的 谢谢!

使用特权

评论回复
8
目中无神| | 2022-5-6 15:26 | 只看该作者

使用特权

评论回复
9
slot867| | 2024-1-31 15:06 | 只看该作者
fully compatible. 板子拿来,换个芯片,性能更佳。MCU不用改 c code。

平替Cirrus Logic芯片

SIG5532B 平替 CS5532BS(32-bit)
SIG5534B 平替 CS5534BS(32-bit)
SIG5532A 平替 CS5532AS(24-bit)
SIG5534A 平替 CS5534AS(24-bit)
SIG5530 平替 CS5530 (24-bit)
SIG5530B 平替 CS5530(32-bit)

平替ADI芯片
SIG7792 平替 AD7792
SIG7793 平替 AD7793
SIG7794 平替 AD7794
SIG7795 平替 AD7795
SIG7796 平替 AD7796
SIG7797 平替 AD7797
SIG7798 平替 AD7798
SIG7799 平替 AD7799

平替TI芯片
SIG1230A 平替 ADS1230 (20-bit)
SIG1232A 平替 ADS1232 (24-bit)

平替ADI芯片
SIG7190 平替 AD7190
SIG7192 平替 AD7192
SIG7193 平替 AD7193

功能替代TI芯片
SIG24130/SIG24131/SIG24132 替代 ADS1220、ADS1247、ADS1248
SIG16130/SIG16131/SIG16132 替代 ADS1120、ADS1147、ADS1148

使用特权

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

本版积分规则

31

主题

225

帖子

4

粉丝