我一直在做一个项目,使用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位。
如果需要更多信息,请告诉我。
2条答案
按热度按时间u59ebvdq1#
如注解中所述,SPI通常由4个信号组成:/SS、SCLK、MOSI和MISO。
在这种情况下,MCU是主机,因此您应该使用MOSI/SDO。MCU几乎总是主机,除非与其他MCU通信。
此外,始终仔细检查从机所期望的CPOL和CPHA设置。弄错这些设置是一个典型的问题,可能会导致微妙的“时钟偏移”问题,即大部分时间一切正常,然后出现故障并间歇性地给予损坏的数据。
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
可能会修改high
和low
变量,因此您可能需要在每次使用它们之前将它们设置为正确的值(因此没有必要使用两个不同的变量,只需使用一个即可)。