This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PCM3168A:使用 SPI 通信将 PCM3168A (从器件)与 ADSPBF527 (主器件)连接-读取 MISO 线路时出现问题

Guru**** 2350610 points
Other Parts Discussed in Thread: PCM3168A
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1495777/pcm3168a-interfaced-pcm3168a-slave-with-adspbf527-master-using-spi-communication---issue-in-reading-the-miso-line

器件型号:PCM3168A

工具/软件:

尊敬的团队:

我们已 使用 SPI 通信将 PCM3168A (从器件)与 ADSPBF527 (主器件)连接。

 从 MISO 线读取数据时遇到问题。

连接用于向 PCM3168A 写入数据和从 PCM3168A 读取数据的参考图像。

在0x40寄存器中写入0xC2值

C1:mosi

C2:CLK

C3:Cs.

C4:MISO

从0x40 (reg)| 0x80 (read)读取、但 MISO 为高电平

请查找以下代码、以供您使用 SPI 配置、写入和读取操作时参考。 要使其正常运行、我们是否需要考虑任何因素

#include
包含"adi_initialize.h"
#include "AudioCodecModule.h"
#include "CodecRdWr.h"
#include
#include

// SPI 设置
#define TIMOD_READ (0x00)
#define TIMOD_WRITE (0x01)
#define SPI_READ (0x01)
#define SPI_WRITE (0x00)
#define SPI_DELAY 2000
#define BAUD_DIV 20 //编解码器在5 MHz 下运行
#define WORD_SIZE16 (0x100)

#define SPI_SPIFPOLL 10000

#define SPI_SCK_PORTG_MUX (uint16_t)((uint16_t)((uint16_t) 0<<0))
#define SPI_MISO_PORTG_MUX (uint16_t)((uint16_t) 0<<0)
#define SPI_MOSI_PORTG_MUX ((uint16_t)((uint16_t) 0<<0)

#define SPI_SCK_PORTG_FER ((uint16_t)((uint16_t) 1<<2)
#define SPI_MISO_PORTG_FER ((uint16_t)((uint16_t) 1<<3)
#define SPI_MOSI_PORTG_FER ((uint16_t)((uint16_t) 1<<4)

void SPI_Enable (void);
void SPI_Write (uint8_t reg、uint8_t data);
void SPI_read (uint8_t reg);
void SPI_Disable (void);

int main (int argc、char *argv[])

/**
*初始化已添加到的托管驱动程序和/或服务
*项目。
*@成功时返回零
*/
int i = 0;
// Adi_initComponents ();

/* Portx_MUX 寄存器*/
*pPORTG_MUX = SPI_SCK_PORTG_MUX | SPI_MISO_PORTG_MUX
| SPI_MOSI_PORTG_MUX;

/* Portx_FER 寄存器*/
*pPORTG_FER = SPI_SCK_PORTG_FER | SPI_MISO_PORTG_FER
| SPI_MOSI_PORTG_FER;

*pPORTF_FER &=~PF7;// SPIO_SSEL1
*pPORTFIO_DIR |= PF7;

*pPORTFIO_CLEAR |= PF7;
对于(I = 0;I < 100;I++)

asm ("nop;");
}
*pPORTFIO_SET |= PF7;//以几毫秒的延迟使低电平到高电平转换

/*在此处开始添加您的自定义代码*/

SPI_Write (0x41、0x01);
SPI_READ (0x41);
返回0;
}

void SPI_Enable (void)

int i = 0;

*pPORTG_FER &=~PG1;// SPIO_SSEL1
* pPORTGIO_DIR |= PG1;
* pPORTGIO_SET |= PG1;

*pSPI_baud = baud_DIV;//20
*pSPI_CTL = SPE | MSTR | WORD_SIZE16 | TIMOD_WRITE;        //CPHA //| WORD_SIZE16;

* pPORTGIO_CLEAR = PG1;//CS 低电平
对于(I = 0;I < 50;I++)

asm ("nop;");
}
}

静态 void SPI_Disable (void)

int i = 0;

* pPORTGIO_SET = PG1;//CS 高电平
*pSPI_CTL &= 0x0000;//禁用 SPI
*pSPI_FLG = 0x0000;

对于(I = 0;I < SPI_DELAY;I++)

asm ("nop;");
}
}

静态 bool Wait_For_(void)

int n;
unsigned short dummyread;
轮询的 INT = 0;

for (n=0;n < SPI_DELAY;n++)

asm ("nop;");
}

while (轮询< SPI_SPIFPOLL)

无符号短接 iTest =*pSPI_STAT;
IF((iTest & SPIF))

printf ("Break\n");
休息;
}
轮询++;
}

dummyread =*pSPI_RDBR;/*读取虚拟以启动数据传输*/
asm ("nop;");
asm ("nop;");

返回轮询< SPI_SPIFPOLL;
}

void SPI_Write (uint8_t reg、uint8_t data)
{//MOSI

uint8_t wrMask =(0x00 << 7);
uint16_t wrFrame =(uint16_t)(((wrMask | reg)<< 8)| data);


SPI_Enable ();

//等待 SPI TX 缓冲器为空
while (!SPIF(); Wait_For_

*pSPI_TDBR = wrFrame;

//等待 SPI 传输完成
while (!SPIF(); Wait_For_

SPI_Disable ();
printf ("W:0x%x -> 0x%x \n"、reg、data);

}

void SPI_READ (uint8_t reg)
{//MISO
uint8_t Rdata = 0;
uint8_t rdMask =(0x01 << 7);
uint16_t rdFrame =(uint16_t)(((rdMask | reg)<< 8)| 0x00);
SPI_Enable ();

//等待 SPI TX 缓冲器为空
while (!SPIF(); Wait_For_

*pSPI_TDBR = rdFrame;

//等待 SPI 传输完成
while (!SPIF(); Wait_For_

/*********** ReadData***************** /
RDATA =(uint8_t)(* pSPI_RDBR);

SPI_Disable ();
printf ("R:0x%x -> 0x%x \n"、reg、RDATA);

}

请支持我们解决这一问题、因为这是一个挑战、对该项目非常重要。

谢谢您、

S Lakshminarayanan Gokul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    首先、您能否确保将 MODE 引脚(引脚48)连接到 VDD 以选择 SPI 模式?

    此外、您能否确认您测量这些信号所用的引脚? 我看到、数据表中有不同的术语、例如 MISO/MOSI。 此外、我无法完全读取示波器图片上的电压、但要确保它们都是3.3V 作为逻辑电平、因为 MISO/MDO 不能耐受5V 电压。  

    此致、
    Mir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mir:

    感谢您的支持!

    是的、MODE 引脚(引脚48)连接到 VDD、连接该片段以供您参考。

    我测量来自引脚42 (SCL)、43 (MOSI)、44 (MISO)、45 (芯片选择)的信号。

    关于您的电压问题、所有 SPI 线路都是3.3V。

    带有用于与 ADSPBF527进行 SPI 通信的参考代码的 PFA 文件是主文件。

    e2e.ti.com/.../3833.Codec.c

    请帮助我们解决这是个问题、同时请提供用于 PCM3168A 作为从器件进行 SPI 通信的伪代码。

    谢谢您、

    S Lakshminarayanan Gokul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您可以尝试移除串联电阻或将其更改为0r 吗? 另外、您需要帮助处理哪些代码? 我可以提供在器件的特定配置下需要写入哪些寄存器、但在设置 Linux 系统来与器件本身通信时不需要写入。  

    此致、
    Mir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的团队:

    感谢您的支持!

    SPI 通信问题已解决。 时钟引脚出现问题、电阻器开路、直到从器件才收到时钟。

    我们使用的是、

    外部时钟11.2896MHz

    24位左对齐 TDM -从模式下为单速率

    采样频率 为44.1kHz

    请验证 SPORT 的寄存器配置是否正确、如果需要进行任何更改、请告知我们。

    谢谢。此致、

    Lakshminarayanan Gokul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    下面是我从配置中读取的注意事项:

    0x40:双速率(对于256或384fs = SYSCLK)

    0x41:24位 LJ TDM

    0x42:如果1<5表示二进制0010 0000、则禁用 DAC3/4操作(具有或不具有省电功能)、DAC1/2/正常、DAC5/6正常、DAC7/8正常-这是不必要的

    0x44:如果1<5表示二进制0010 0000、则启用 DAC6静音-这是不必要的还是错误的?

    0x50:ADC 单速率(512fs 和768fs)->如果使用相同的 FSYNC 和 11.2896MHz、则可能需要像 DAC 那样的双速率、因为比率 DAC/44.1kHz = 256

    0x51:24位 LJ 模式 TDM 格式

    此致、
    Mir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mir Jeffres:

    感谢您的支持。

    DAC 控制2 寄存器0x42配置为0x00

    DAC 软静音寄存器0x44配置为0xFF

    我们使用的编解码器引脚如下:

    1 - SCKL 连接到11.289MHz 外部时钟

    2 - BCKAD -相同的11.289 MHz 外部时钟(BCKDA 未连接)

    3- LRCKAD- TFS0 (ADSP 的发送帧同步= 44.1kHz (LRCKDA 未连接)

    4- DOUT 1至 ADSP 运动数据输入

    5- DIN1至 ADSP SPORT 数据输出

    根据您的建议、我们已将 ADC 和 DAC 更改为双速率采样、但我们不会从编解码器获取 DOUT

    切换回单速率采样后、我们将获得 DIN 和 DOUT 上的数据

    请参阅下图  

    通道 C3 (红色)- LRCKAD

    通道 C1 (黄色)- SCKL

    通道 C2 (蓝色)- DIN1

    通道 C4 (绿色):DOUT1

       

     

    请核实并建议我们、我们是否遗漏了任何信息。

    此致、

    Lakshminarayanan Gokul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    确保寄存器0x44设置为00、这将禁用所有 DAC 输出的静音(如果设置为 FF)、所有 DAC 通道都将静音。 此外、抱歉是的、您要采用单一速率、我在 数据表中看到一个单一速率44.1kHz 的示例、似乎双速率和四速率是44.1k 和48K 的2倍或4倍典型音频采样率。  

    如果您需要更多帮助、请告诉我。

    此致、
    Mir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mir:

    感谢您的支持和澄清。

    我们将0x44设置为00并配置为单一速率。

    完成这些设置后、编解码器 DAC 无法正常工作、并且我们在 VOUT 引脚中没有任何模拟输出(VOUT = 2.5V)。 不过、我们可以看到来自 DIN 和 DOUT 的数据

    模拟输入似乎正常工作、我们有两个模块通过 POE (以太网供电)相互通信、一个模块带有 PCM3168A、另一个模块带有 CS42436编解码器。 我们正在 向 PCM3168A 模块的模拟输入提供外部正弦波信号、并且来自 PCM3168A 模块的数据由主控制器(ADSP)通过以太网发送到另一 模块、我们可以在 CS42436模块的模拟输出上看到相同的正弦波频率。

    以下是一些观察结果、

    1.当我们将复位控制寄存器(0x40)设置为0xC1时、我们会读回相同的值。 但是、当我们将 控制寄存器(0x40)设置为0x01时、我们会读取为0xC0 (它设置为默认设置)

    2.我们看到 ADC OVF (溢出)引脚持续拉高、我们将 OVFP 位设置为0 - 对于过流检测、该位为高电平。  但是、我们在 ADC 溢出标志(0x56)寄存器中读取所有零、这表明 未检测到 ADC 溢出输入。 下面的图片供您参考。 此引脚持续拉高是否有任何其他原因。

    C1 (黄色)-外部复位

    C2 (红色)- OVF 引脚

    请就此为我们提供支持、以便更清楚地了解相关信息、并验证以下寄存器配置。

    寄存器 值(Aibo) 说明
    0x40 0xC1 复位控制  
    0x41 0x07 DAC 控制1
    0x42 0x20 DAC 控制2
    0x43 0x00 DAC 输出相位
    0x44 0x00 DAC 软静音
    0x45 0xCC DAC 零标志
    0x46 0x00 DAC 控制3.
    0x47 0x00 DAC 衰减
    0x48 0x00 DAC 衰减
    0x49 0x00 DAC 衰减
    0x4A 0x00 DAC 衰减
    0x4B 0x00 DAC 衰减
    0x4C 0x00 DAC 衰减
    0x4D 0xFF DAC 衰减
    0x4E 0xFF DAC 衰减
    0x4F 0xFF DAC 衰减  
    0x50   0x01 ADC 采样模式
    0x51   0x07 ADC 控制1
    0x52    0x00 ADC 控制2
    0x53     0x00 ADC 输入配置
    0x54    0x00 ADC 输入相位
    0x55   0x00 ADC 软静音
    0x56   0x00 ADC 溢出标志  
    0x57    0x80 ADC 控制3.
    0x58    0xD7 ADC 衰减
    0x59    0xD7 ADC 衰减  
    0x5A   0xD7 ADC 衰减
    0x5B    0xD7 ADC 衰减
    0x5C    0xD7 ADC 衰减
    0x5D 的地址    0xD7 ADC 衰减
    0x5E   0xD7 ADC 衰减

    谢谢。此致、

    Lakshminarayanan Gokul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    当您将0x40设置为0x01时、您会触发"模式控制寄存器复位"和时钟复位。 这些操作可能会复位所有寄存器和 ADC/DAC 操作、您应该将寄存器0x40的前两位设置为11来避免这种情况。

    关于 OVF、我认为我在复位结束时看到了短脉冲、这正是我们预期的-根据数据表:"OVF 引脚还通过发送4096个 SCKI 宽度脉冲指示了内部复位完成。" 您正在为 ADC 提供哪些输入? 能否在测量 OVF 引脚的同时进行测量?

    我在后面附上我的评论、我在寄存器配置中逐行进行了说明。 不确定是读取还是写入。 确保我所注释的内容对您的配置有意义。

    0x40	0xC1	RESET CONTROL # should be fine, setting to single rate mode
    0x41	0X07	DAC CONTROL 1 #slave mode, 24 bit left justified tdm mode
    0x42	0x20	DAC CONTROL 2 #dac 3/4 disable? all other dac channels normal operation
    0x43	0x00	DAC OUTPUT PHASE #normal output phase for all channels
    0x44	0x00	DAC SOFT MUTE #disabled mute for all channels
    0x45	0xCC	DAC ZERO FLAG #dac8, dac7, dac 2, and dac 1 zero flag? this is read only...
    0x46	0x00	DAC CONTROL 3 #default - independent attenuation control for all dac channels
    0x47	0x00	DAC ATTENUATION #this reg could control all channels, but previous register ATMDDA does not allow it
    0x48	0x00	DAC ATTENUATION #ch1 muted
    0x49	0x00	DAC ATTENUATION #ch2 muted
    0x4A	0x00	DAC ATTENUATION #ch3 muted
    0x4B	0x00	DAC ATTENUATION #ch4 muted
    0x4C	0x00	DAC ATTENUATION #ch5 muted
    0x4D	0xFF	DAC ATTENUATION #no attenuation for ff -> ch6 unmuted
    0x4E	0xFF	DAC ATTENUATION #ch7 unmuted
    0x4F	0xFF	DAC ATTENUATION #ch8 unmuted
    0x50 	0x01	ADC SAMPLING MODE #adc in single rate mode
    0x51 	0x07	ADC CONTROL 1 #24 bit left justified mode tdm format adc
    0x52  	0x00	ADC CONTROL 2 #normal operation
    0x53   	0x00	ADC INPUT CONFIGURATION #differential input for all channels
    0x54  	0x00	ADC INPUT PHASE #no phase changes
    0x55 	0x00	ADC SOFT MUTE #mute disabled
    0x56 	0x00	ADC OVERFLOW FLAG #overflow not detected
    0x57  	0x80	ADC CONTROL 3 #all channels w preset + master control so atad0 controls the attenuation
    0x58  	0xD7	ADC ATTENUATION #no attenuation on all channels of adc
    0x59  	0xD7	ADC ATTENUATION 
    0x5A 	0xD7	ADC ATTENUATION
    0x5B  	0xD7	ADC ATTENUATION
    0x5C  	0xD7	ADC ATTENUATION
    0x5D  	0xD7	ADC ATTENUATION
    0x5E 	0xD7	ADC ATTENUATION

    此致、
    Mir