[测量] cs5530读到的数据全是FF

[复制链接]
5578|8
 楼主| lovezichao 发表于 2022-3-1 10:17 | 显示全部楼层 |阅读模式
本帖最后由 lovezichao 于 2022-3-1 10:35 编辑

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

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

  3. #define CMD_CS30_READ_OFFSET_REG        ((1 << 3) | (1 << 0))
  4. #define CMD_CS30_WRITE_OFFSET_REG      ((0 << 3) | (1 << 0))
  5.                                                                                                                                                                         
  6. #define CMD_CS30_READ_GAIN_REG           ((1 << 3) | (1 << 1))
  7. #define CMD_CS30_WRITE_GAIN_REG         ((0 << 3) | (1 << 1))
  8.                                                                                                                                                                         
  9. #define CMD_CS30_READ_CFG_REG             ((1 << 3) | (3 << 0))
  10. #define CMD_CS30_WRITE_CFG_REG           ((0 << 3) | (3 << 0))

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

  13. #define CMD_CS30_SYS_OFFSET_CALIB       0x85
  14. #define CMD_CS30_SYS_GAIN_CALIB           0x86


  15. #define CFG_BIT_RS_CS30                (1 << 29)
  16. #define CFG_BIT_RV_CS30                (1 << 28)
  17. #define CFG_BIT_FRS_CS30               (1 << 19)

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

  20. #define CFG_B_POLAR_CS30             (0x00 << 10)               
  21. #define CFG_U_POLAR_CS30             (0x01 << 10)               

  22. #define WR_CS30_120                 (0x00 << 11)
  23. #define WR_CS30_60                   (0x01 << 11)
  24. #define WR_CS30_30                   (0x02 << 11)
  25. #define WR_CS30_15                   (0x03 << 11)
  26. #define WR_CS30_7p5                 (0x04 << 11)
  27. #define WR_CS30_3840               (0x08 << 11)
  28. #define WR_CS30_1920               (0x09 << 11)
  29. #define WR_CS30_960                 (0x0A << 11)
  30. #define WR_CS30_480                 (0x0B << 11)
  31. #define WR_CS30_240                 (0x0C << 11)


  32. void CS5530_Write_Byte(unsigned char dat);
  33. void CS5530_Read_Data(void);
  34. void CS5530_Sample(void);
  35. void CS5530_Init(void);
  36. void CS5530_Read(uint8_t* Buf, uint32_t len);
  37. int32_t CS5530_ReadADC_Data(void);
  38. void CS5530_Read(uint8_t* Buf, uint32_t len);
  1. .C文件:

  2. #include "stm32l0xx_hal.h"
  3. #include "cs5530.h"
  4. #include "stm32l0xx_hal_spi.h"
  5. #include "main.h"
  6. #include "string.h "

  7. #define _SPI_DELAY_    50                //
  8. #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))      
  9. #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))      
  10. #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))      
  11. #define SPI_MISO        HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)     

  12. void SPI_Delay(uint16_t del){
  13.       
  14.   while(del--){
  15.     __NOP();
  16.     __NOP();
  17.     __NOP();
  18.     __NOP();
  19.     __NOP();
  20.   }
  21. }

  22. uint8_t SPI_Write_Read_Byte(uint8_t TX_Dat){
  23.         uint8_t i;
  24.         uint8_t RX_Dat = 0;
  25.   
  26.         for(i = 0; i < 8; i++){
  27.    
  28.                 if(TX_Dat & 0x80){
  29.                         SPI_MOSI(1);
  30.                 } else {
  31.                         SPI_MOSI(0);
  32.                 }
  33.     TX_Dat <<= 1;
  34.    
  35.     SPI_CLK(1);
  36.     SPI_Delay(_SPI_DELAY_);
  37.    
  38.     RX_Dat <<= 1;
  39.                 if(SPI_MISO != 0){
  40.                         RX_Dat |= 0x01;
  41.                 }
  42.    
  43.     SPI_CLK(0);
  44.     SPI_Delay(_SPI_DELAY_);
  45.         }  

  46.         return RX_Dat;
  47. }

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

  50.         for(i = 0; i < len; i++){
  51.                 SPI_Write_Read_Byte(data);
  52.         }
  53. }

  54. static void CS5530_Read(uint8_t* Buf, uint32_t len){
  55.         uint32_t i;
  56.    
  57.         for(i = 0; i < len; i++){
  58.                 Buf = SPI_Write_Read_Byte(0x00);
  59.         }
  60. }

  61. static uint8_t CS30_CMD_BUF[20];

  62. #define SYNC_LEN 18
  63. static void CS5530_Sync(void){
  64.         memset(CS30_CMD_BUF,0xff,SYNC_LEN);
  65.         CS30_CMD_BUF[SYNC_LEN - 1] = 0xfe;
  66.         CS5530_Send(CS30_CMD_BUF,SYNC_LEN);
  67. }

  68. static void CS5530_WriteResByCmd(uint32_t cmd,uint32_t res){
  69.         CS30_CMD_BUF[0] = cmd;
  70.         CS30_CMD_BUF[1] = res >> 24;
  71.   CS30_CMD_BUF[2] = res >> 16;
  72.   CS30_CMD_BUF[3] = res >> 8;
  73.   CS30_CMD_BUF[4] = res;
  74.       
  75.         CS5530_Send(CS30_CMD_BUF,5);
  76. }

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

  79.         CS5530_Send(CS30_CMD_BUF,1);
  80.         CS5530_Read(&CS30_CMD_BUF[1],4);
  81.       
  82.         return (uint32_t)((CS30_CMD_BUF[1] << 24) | (CS30_CMD_BUF[2] << 16) | (CS30_CMD_BUF[3] << 8) | CS30_CMD_BUF[4]);
  83. }

  84. static void CS5530_Reset(void){
  85.         //Read Cfg , clear RV bit
  86.         CS5530_ReadResByCmd(CMD_CS30_WRITE_CFG_REG);
  87.       
  88.         //write RS bit to 1, wait 8 master clock sycles wirte RS back to 0.
  89.         CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, CFG_BIT_RS_CS30);
  90. //        osDelay(pdMS_TO_TICKS(5));
  91.         SPI_Delay(10);
  92.         CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, 0);
  93.       
  94.         while(!(CS5530_ReadResByCmd(CMD_CS30_WRITE_CFG_REG) & CFG_BIT_RV_CS30)){
  95. //                osDelay(pdMS_TO_TICKS(5));
  96.                 SPI_Delay(100);
  97.         }

  98.         CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, 0);
  99. }

  100. static void CS5530_Start(uint32_t type){
  101.         CS30_CMD_BUF[0] = type;
  102.   CS5530_Send(CS30_CMD_BUF,1);
  103. }

  104. static uint32_t cfgResCS30 = 0;

  105. void CS5530_Init(){
  106.         SPI_CS(0);  
  107.         CS5530_Sync();
  108.         CS5530_Reset();
  109.       
  110.         cfgResCS30 = CFG_VRS_25LS_CS30 | WR_CS30_240 | CFG_U_POLAR_CS30;// | CFG_BIT_FRS_CS30;
  111.         CS5530_WriteResByCmd(CMD_CS30_WRITE_CFG_REG, cfgResCS30);
  112.       
  113.   HAL_Delay(5);

  114.         CS5530_Start(CMD_CS30_CONTINUOUS_CONVER);//
  115.         SPI_CS(1);
  116. }

  117. int32_t CS5530_ReadADC_Data() {
  118.         int32_t adcCode = 0;
  119.       
  120.   memset(CS30_CMD_BUF, 0x00, 5);
  121.       
  122.         SPI_CS(0);
  123.   CS5530_Read(CS30_CMD_BUF, 5);
  124.         SPI_CS(1);
  125.   
  126.         adcCode = (CS30_CMD_BUF[1] << 24) | (CS30_CMD_BUF[2] << 16) | (CS30_CMD_BUF[3] << 8) | CS30_CMD_BUF[4];
  127.   
  128.   return adcCode;
  129. }


 楼主| lovezichao 发表于 2022-3-1 17:11 | 显示全部楼层
虽然没有人回复,但是这个问题解决了,现在把解决后的代码附上,后面如果有人再遇见类似问题,可以参考。
  1. #include "stm32l0xx_hal.h"
  2. #include "CS5530-test.h"
  3. #include "main.h"

  4. #define _SPI_DELAY_                50                //
  5. #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))      
  6. #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))      
  7. #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))      
  8. #define SPI_MISO        HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)     

  9. void SPI_Delay(uint16_t del){
  10.        
  11.   while(del--){
  12.     __NOP();
  13.     __NOP();
  14.     __NOP();
  15.     __NOP();
  16.     __NOP();
  17.   }
  18. }

  19. void Write_Cs5530_Byte(uint8_t TX_Data){
  20.        
  21.         uint8_t loop;
  22.         SPI_CLK(0);

  23.         for(loop = 0; loop < 8; loop++){
  24.                
  25.                 if(TX_Data & 0x80){
  26.                         SPI_MOSI(1);
  27.                 } else {
  28.                         SPI_MOSI(0);
  29.                 }
  30.     TX_Data <<= 1;
  31.     SPI_CLK(1);
  32.                 SPI_Delay(_SPI_DELAY_);
  33.                 SPI_CLK(0);
  34.                 SPI_Delay(_SPI_DELAY_);
  35.         }
  36. }

  37. uint8_t Read_Cs5530_Byte(void){
  38.         uint8_t loop,RX_Data;
  39.         SPI_CLK(0);
  40.         for(loop = 0; loop < 8; loop++){
  41.                 RX_Data <<= 1;
  42.     if(SPI_MISO){
  43.       RX_Data |= 0x01;
  44.                 }
  45.    
  46.                 SPI_CLK(0);
  47.                 SPI_Delay(_SPI_DELAY_);
  48.                 SPI_CLK(1);
  49.                 SPI_Delay(_SPI_DELAY_);
  50.         }
  51.        
  52.         return RX_Data;
  53. }

  54. void Write_Cs5530_DWord(uint8_t* data, uint8_t len){
  55.   
  56.   uint32_t i;

  57.         for(i = 0; i < len; i++){
  58.                 Write_Cs5530_Byte(data[i]);
  59.         }
  60. }

  61. static uint8_t CS30_CMD_BUF[5];

  62. static void CS5530_WriteResByCmd(uint32_t cmd,uint32_t res){
  63.         CS30_CMD_BUF[0] = cmd;
  64.         CS30_CMD_BUF[1] = res >> 24;
  65.   CS30_CMD_BUF[2] = res >> 16;
  66.   CS30_CMD_BUF[3] = res >> 8;
  67.   CS30_CMD_BUF[4] = res;
  68.        
  69.         Write_Cs5530_DWord(CS30_CMD_BUF,5);
  70. }

  71. int32_t Read_Cs5530_AD(void){
  72.         uint8_t loop;
  73.         uint32_t da;
  74.        
  75.         SPI_CLK(0);
  76.   SPI_CS(0);
  77.         SPI_Delay(_SPI_DELAY_);
  78.   
  79. //        while(SPI_MISO);
  80.        
  81.         Write_Cs5530_Byte(NULL_BYTE);//发送8个NULL数据清到SDI引脚,清SDO数据
  82.         for(loop = 0; loop < 32; loop++){
  83.                 da <<= 1;
  84.    
  85.     if(SPI_MISO){
  86.       da |= 0x01;
  87.     }

  88.                 SPI_CLK(1);
  89.                 SPI_Delay(_SPI_DELAY_);
  90.                 SPI_CLK(0);
  91.                 SPI_Delay(_SPI_DELAY_);
  92.         }
  93.         da >>= 14;
  94.   
  95.   SPI_CS(1);
  96.         return da;
  97. }

  98. void cs5530_init(void){
  99.         uint8_t loop;
  100.   
  101.   HAL_Delay(20);
  102.         SPI_MOSI(0);
  103.         SPI_CLK(0);
  104.   SPI_CS(0);
  105.        
  106.   //发送至少15个0xff,一个0xfe
  107.         for(loop = 0; loop < 30; loop++){
  108.                 Write_Cs5530_Byte(SYNC1);
  109.         }
  110.         Write_Cs5530_Byte(SYNC0);
  111.        
  112. //        Write_Cs5530_Byte(CMD_WRITE + REG_CONFIG);//写配置寄存器
  113.         CS5530_WriteResByCmd(CMD_WRITE + REG_CONFIG,SYSTEM_RESET);//写复位指令
  114.         HAL_Delay(20);
  115.         CS5530_WriteResByCmd(CMD_WRITE + REG_CONFIG,0);//写复位指令
  116.   
  117.   //
  118.   
  119. //        Write_Cs5530_Byte(CMD_WRITE + REG_CONFIG);
  120.         CS5530_WriteResByCmd(CMD_WRITE + REG_CONFIG,VREF_HIGH | DATARATE_12P5 | UNIPOLAR_MODE);//正常操作,FRS = 0,速度15sps,单极性模式
  121.         Write_Cs5530_Byte(NORMAL_CONVERSION + START_CONTINUOUS);
  122.   
  123.   SPI_CS(1);
  124. }
目中无神 发表于 2022-3-27 17:04 | 显示全部楼层
CS5530 问题解决了吗?  QQ 979353574
目中无神 发表于 2022-3-27 18:03 | 显示全部楼层
lovezichao 发表于 2022-3-1 17:11
虽然没有人回复,但是这个问题解决了,现在把解决后的代码附上,后面如果有人再遇见类似问题,可以参考。
...

很好 很好 就是我的不好用!
目中无神 发表于 2022-3-27 18:05 | 显示全部楼层
lovezichao 发表于 2022-3-1 17:11
虽然没有人回复,但是这个问题解决了,现在把解决后的代码附上,后面如果有人再遇见类似问题,可以参考。
...

帮助一下 QQ 979353574 谢谢!
 楼主| lovezichao 发表于 2022-3-31 17:16 | 显示全部楼层
目中无神 发表于 2022-3-27 18:05
帮助一下 QQ 979353574 谢谢!

解决没?可以检查一下时序延时。
目中无神 发表于 2022-4-2 14:28 | 显示全部楼层
好的 谢谢!
目中无神 发表于 2022-5-6 15:26 | 显示全部楼层
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

粉丝
快速回复 在线客服 返回列表 返回顶部