当前位置: 首页 > 知识库问答 >
问题:

ADC MCP3561不返回转换值

鲍驰
2023-03-14


我使用这个MCP3561,没有外部时钟(MCLK),也没有使用中断(irq)(都是浮动的)。
数据表
我最初试图运行快速命令来获取adcdata,但它全部返回0.
然后我试图相应地设置所有配置位,并且当读取adcdata时,它仍然返回数据的所有0。但是在读取所有地址的增量中,我可以看到配置中的数据很好。

  t_buf[0] = 0b01110110; //slaveaddr + lockregister + wr
  t_buf[1] = 0b10100101; // wr 0xa5 to unlock writing to registers
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, 0);
  HAL_SPI_Transmit(&hspi1, t_buf, 2, 1000); //unlock resgisters
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, 1);

  t_buf[0]  = 0b01000110; //slave address - reg address - write
  t_buf[1]  = 0b01100011; //config 0
  t_buf[2]  = 0b00011100; //config 1
  t_buf[3]  = 0b10101011; //config 2
  t_buf[4]  = 0b11000000; //config 3 - bit 4-5 is data_format[1:0]
  t_buf[5]  = 0b00100000; //irq register
  t_buf[6]  = 0b00000001; //mux
  t_buf[7]  = 0b00000000; //7-8-9 scan register
  t_buf[8]  = 0b00000000;
  t_buf[9]  = 0b00000000;
  t_buf[10] = 0b00000000; //10-11-12 timer delay value
  t_buf[11] = 0b00000000;
  t_buf[12] = 0b00000000;
  t_buf[13] = 0b00000000; //13-14-15 offset calibration
  t_buf[14] = 0b00000000;
  t_buf[15] = 0b00000000;
  t_buf[16] = 0b10000000; //16-17-18 gain calibration //0x80 is default 1x gain
  t_buf[17] = 0b00000000;
  t_buf[18] = 0b00000000;
  t_buf[19] = 0b10010000; //19-20-21 reserved should be set at 0x90
  t_buf[20] = 0b00000000;
  t_buf[21] = 0b00000000;
  t_buf[22] = 0b01010000; // reserved set at 0x50
  t_buf[23] = 0b00000000; // lock register 0xa5 unlock anything else lock


  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, 0);
  HAL_SPI_Transmit(&hspi1, t_buf, 23, 1000);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, 1);

我的阅读功能:

float Get_ADC(void){
    float val;
    float sensor_val;

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, 0);    //pull down cs line on adc to enable spi on chip
    t_buf[0] = 0b01000011;
    t_buf[1] = 0b00010000;
    //HAL_SPI_TransmitReceive(&hspi1, t_buf, r_buf, 3, 1000);

    HAL_SPI_Transmit(&hspi1, t_buf, 1, 1000);
    HAL_SPI_Receive(&hspi1, r_buf, 28, 1000);

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, 1);    //return cs line to high to disable spi on chip



    return(sensor_val);

我读到的数据是:

r_buf[0]    uint8_t 0 '\0'  
r_buf[1]    uint8_t 0 '\0'  
r_buf[2]    uint8_t 0 '\0'  
r_buf[3]    uint8_t 99 'c'  
r_buf[4]    uint8_t 28 '\034'   
r_buf[5]    uint8_t 171 '«' 
r_buf[6]    uint8_t 192 'À' 
r_buf[7]    uint8_t 48 '0'  
r_buf[8]    uint8_t 1 '\001'    
r_buf[9]    uint8_t 0 '\0'  
r_buf[10]   uint8_t 0 '\0'  
r_buf[11]   uint8_t 0 '\0'  
r_buf[12]   uint8_t 0 '\0'  
r_buf[13]   uint8_t 0 '\0'  
r_buf[14]   uint8_t 0 '\0'  
r_buf[15]   uint8_t 0 '\0'  
r_buf[16]   uint8_t 0 '\0'  
r_buf[17]   uint8_t 0 '\0'  
r_buf[18]   uint8_t 128 '\200'  
r_buf[19]   uint8_t 0 '\0'  
r_buf[20]   uint8_t 0 '\0'  
r_buf[21]   uint8_t 144 '\220'  
r_buf[22]   uint8_t 0 '\0'  
r_buf[23]   uint8_t 0 '\0'  
r_buf[24]   uint8_t 80 'P'  
r_buf[25]   uint8_t 165 '¥' 
r_buf[26]   uint8_t 0 '\0'  
r_buf[27]   uint8_t 12 '\f' 
r_buf[28]   uint8_t 0 '\0'  

r_buf[3]返回写入的配置0和。。。。以r_buf[28]结束锁寄存器。r_buf[0],1,[2]应该返回我的24位数据,无论配置设置的组合如何,它都将始终返回0。我目前有一个光度二极管分别连接到ch0-ch1。它位于连接到具有spi_模式(1,1)的stm32l412芯片的印刷pcb上。
我目前的假设是,adc从未离开关机/Hibernate模式,不会进行任何转换。

-Ross

共有1个答案

归俊杰
2023-03-14

看起来你用的是STM32 HAL。我发现在HAL_SPI_Transmit()之后,我必须调用HAL_SPIEx_FlushRxFifo(

另外,您的呼叫HAL\u SPI\u传输(

要分离ADC或SPI是否存在问题,可以尝试读取ADC的内部温度;通过读取通道之间的数据(然后根据数据表第5.1.2节和图2-32或2-33进行转换)。

 类似资料:
  • 我试图返回一个列表,并将该响应重定向到我的模型类。 例如:如果我使用,它工作得很好,但我不想为每个模型编写响应方法。 方法 错误 出现错误(Type=内部服务器错误,状态=500)。创建名为“index”的bean时出错:调用init方法失败;嵌套异常为java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为com.xxx.Applic

  • 使用AndroidX导航组件,我在两个片段之间创建了一个共享元素转换。第一个片段有一个RecyclerView,第二个片段显示单击元素的详细信息。enter转换始终按预期工作。如果我立即按下“后退”按钮,返回转换就可以工作。但是,如果我在按后退按钮之前等待超过大约5秒,动画就不能正常工作了。 那样的话,根本就没有动画。没有移动,没有褪色,碎片中的一切只是立即出现在原地。 下面是主要片段中的导航代码

  • 问题内容: 怎么转换成?如果应该这样做 那怎么算呢? 以及如何转换为? 问题答案: 缓冲区长度为frameCapacity * bytesPerFrame。以下是可以在NSData和AVAudioPCMBuffer之间进行转换的函数。

  • 我希望代码得到一个int作为参数,如果年龄是奇数,则加3,如果是偶数,则加2,然后作为字符串返回。 有了这个代码我得到了 不兼容的类型:无法将int转换为字符串 九号线不是已经换了吗?

  • 我尝试通过methodhandles将方法链接在一起,其中一些方法来自泛型类型。如果函数返回泛型类型,我必须为MethodType指定Object.Class,但我看不到将其转换回泛型类型参数类型的简单方法。在大多数情况下,这没有问题,因为invoke似乎自动转换它们,但我必须创建mhs,它可以用InvokeExact运行。难道没有简单的方法使用MethodHandles进行强制转换吗? 我的测试

  • 我面临的问题是:返回值无法转换为WebElement。我使用BrowserStack作为云平台。 我的应用程序代码: 控制台输出: 线程“main”中的异常0_191WebDriverException:返回的值无法转换为WebElement:{ELEment=4EE2A34-EE35-4F14-8EED-A33EEEEE55}构建信息:版本:“3.6.0”,修订版:“6fbf3ec767”,时间