在带PGA 2310音量控制IC的RP 2040 C/C++ SDK中正确使用SPI功能

o4tp2gmn  于 2022-12-22  发布在  C/C++
关注(0)|答案(2)|浏览(366)

我一直在做一个项目,使用PGA2310音量控制IC来设置音频信号的音量。该芯片的接口应该是SPI,但无论我如何尝试,似乎都无法正确操作。该芯片通过SPI接收一个16位字,其中包含左右声道的音量信息。
我想知道我是否使用的sdk都错了,我的代码是重击。
我想我的问题是* * 是否正确设置和使用SPI功能?**
下面是我的代码

/**
     * SPI interface for PGA2310 volume control ic  
    */

    #include "pico/stdlib.h"
    #include "hardware/spi.h"
    #include "pico/time.h"

    const int CS = 0; 
    const int SDI = 1; 
    const int SCLK = 2;
    const int LED_PIN16 = 16; 
    const int LED_PIN25 = 25;

    uint16_t PGA2310(); 

    uint16_t PGA2310() {
        int baud = 1600000; 

        // SPI inistalization
        spi_init(spi0, baud); 
        spi_set_format(spi0, 16, SPI_CPOL_0 , SPI_CPHA_0, SPI_MSB_FIRST);

        // Sets SPI pins 
        gpio_set_function(CS, GPIO_FUNC_SPI);
        gpio_set_function(SDI, GPIO_FUNC_SPI);
        gpio_set_function(SCLK, GPIO_FUNC_SPI);
    
        // Sets LED pins
        gpio_init(LED_PIN16); 
        gpio_set_dir(LED_PIN16, GPIO_OUT); 
        gpio_init(LED_PIN25); 
        gpio_set_dir(LED_PIN25, GPIO_OUT); 

        // Data to send to chip. only sending first 8 bits for right channel. 
        // This is because I am currently just testing the output of the right channel
        uint16_t high = 255; 
        uint16_t low = 100; 
     
        // Test by toggling between high and low volume states with LED indicators
        while (true) {
            gpio_put(LED_PIN25, 1);
            spi_write16_blocking(spi0, &high, 1);
            sleep_ms(2000);
            gpio_put(LED_PIN25, 0);
            spi_write16_blocking(spi0, &low, 1);
            sleep_ms(2000);
        }
    
    }

我已经尝试了很多不同的方法,我在网上找到的使用SPI与pico SDK。我尝试只发送8位。
如果需要更多信息,请告诉我。

u59ebvdq

u59ebvdq1#

如注解中所述,SPI通常由4个信号组成:/SS、SCLK、MOSI和MISO。

  • /SS =从机选择,也称为片选。几乎总是低电平有效。
  • SCLK =串行时钟。
  • MOSI =主机输出从机输入。主数据线。你的MCU好像叫这个SDO(串行数据输出?)
  • MISO =主输入从输出。双工(双向)通信SPI的可选信号。您的MCU似乎将此称为SDI(串行数据输入)。

在这种情况下,MCU是主机,因此您应该使用MOSI/SDO。MCU几乎总是主机,除非与其他MCU通信。
此外,始终仔细检查从机所期望的CPOL和CPHA设置。弄错这些设置是一个典型的问题,可能会导致微妙的“时钟偏移”问题,即大部分时间一切正常,然后出现故障并间歇性地给予损坏的数据。

wvt8vs2t

wvt8vs2t2#

您为C代码中的变量/常量选择的名称对硬件没有任何影响,代码编译后它们会立即消失。最重要的是您了解硬件的工作原理,阅读您正在调用的RP 2040 SDK函数的文档,然后将正确的 * 值 * 传递给RP 2040 SDK函数。
最大的问题是您需要重新考虑每个引脚分配。RP 2040硬件SPI引脚功能在RP 2040数据手册“GPIO功能”部分的F1列中定义。以下是该表的摘录:

例如,该表告诉我们,您 * 不能 * 将引脚0用作SPI 0 CS功能。如果您将该引脚指定为SPI引脚,则它 * 将 * 成为SPI 0 RX(数据接收)引脚。
至少,您需要选择一个引脚作为SPI 0 SCK引脚,另一个作为SPI 0 TX引脚,并且必须将这些引脚从RP 2040连接到器件上的等效引脚。然后,您可能还需要选择一个RP 2040引脚来控制器件上的CS引脚(如果有的话)。在RP 2040端,此引脚将配置为GPIO输出引脚,您可以将其驱动为低电平或高电平以使能器件。有关输入端所需信号的详细信息,请参阅器件数据手册,然后使用示波器确保生成兼容信号。
另一个问题是,spi_write16_blocking可能会修改highlow变量,因此您可能需要在每次使用它们之前将它们设置为正确的值(因此没有必要使用两个不同的变量,只需使用一个即可)。

相关问题