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.

[参考译文] PCM2707C:通过 SPI 更改描述符数据

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1081985/pcm2707c-change-descriptor-data-through-spi

部件号:PCM2707C
《线程》中讨论的其它部件:PCM2705C

您好,

我想用 SPI 更改 USB 描述符数据。

我在这里做错了什么?  

第一行是 CS,而不是数据,第三行是时钟。

PSEL 和主机线路都很高。 D+线被拉低。

谢谢!  

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

    可以 通过 SPI 端口(PCM2705C/7C)修改设备描述符;只有在 PSEL 和主机像您一样高时,此描述符编程功能才可用。 有关更多功能详情,请参阅 第9.5.1节 USB 接口

    请检查注释4 ( 数据表第35页): 在 PCM2707C 电源准备就绪且 SPI 主机(DSP)准备好发送数据之前,MS 必须处于高位。 此外,如果描述符是通过 SPI 编程的,SPI 主机必须处理 D+下拉菜单。 在通过 SPI 对 PCM2707C 进行编程之前,不得激活 D+上拉(高= 3.3 V)。

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

    感谢您的回复,但这未能解决我的问题。

    与此同时,我能够更改描述符名称,但它不能按预期工作。

    一些奇怪的事情让它发挥作用:

    • 末尾添加额外的写入(我添加了0x00)
    • 产品字符串的第一个字节不会用作产品字符串的一部分。 每次不更改描述符时,我都应该进行更改。 (看起来像 ID 或其他东西一样工作)

    因此,我可以更改描述符,但我想知道如何在没有这些 奇怪调整的情况下进行更改  

    这是“有效”代码:

    static void usb_spiWriteDescriptor()
    {
    	uint8_t dataToSend[58] = {0xBB, 0x08, 0x04, 0x27,
    			0x02, 0x41, 0x75, 0x64, 0x61, 0x63, 0x20, 0x2D, 0x20, 0x44, 0x57, 0x50, 0x33, 0x34, 0x35, 0x20,		// To change this text, the first number needs to be changed
    			0x20, 0x20, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x20, 0x61,
    			0x72, 0x65, 0x20, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2E, 0x20,
    			0x80,
    			0x7D,
    			0x0A, 0x93, 0x01, 0x00
    		};
    
    	uint8_t wordToSend[2] = {0x02, 0x00};
    	spi_DMA_write(0, 0, 2, &wordToSend[0], &usbSPiHandle, GPIO_USBCS);
    
    
    	/* Reverse the bit order */
    	for(uint8_t n = 0; n < 58; n++)
    	{
    		dataToSend[n] = (dataToSend[n] & 0xF0) >> 4 | (dataToSend[n] & 0x0F) << 4;
    		dataToSend[n] = (dataToSend[n] & 0xCC) >> 2 | (dataToSend[n] & 0x33) << 2;
    		dataToSend[n] = (dataToSend[n] & 0xAA) >> 1 | (dataToSend[n] & 0x55) << 1;
    
    		wordToSend[1] = dataToSend[n];
    		wordToSend[0] = 0x08;
    
    		spi_DMA_write(0, 0, 2, &wordToSend[0], &usbSPiHandle, GPIO_USBCS);
    	}
    }

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

    我可以尝试 查看 您的脚本 ,但我 使用 I2C 主控类型 GUI, 在其中,我只需将  每个寄存器的指令直接写入脚本中 ,并且不熟悉此编码,因此我可能无法发现问题。 但我会给它一个机会。

    此致,

    阿拉什

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

    我看了节目,并将其与数据表的示例进行了比较。  数据表清楚地指示了57个字节,因此我认为您正在添加一个额外的字节, 然后该字节似乎  可以正常工作,这可能意味着您的第一个字节 未被读取。 您能否绘制 SPI 写入操作图,以便查看操作的完整详细信息(参见图29)

    从数据表中:“数据必须从地址0x00存储,并且必须由57字节组成,根据下列参数: •供应商 ID (2字节)•产品 ID (2字节)•产品字符串(ANSI ASCII 代码为16字节)•供应商字符串(ANSI ASCII 代码为32字节)•电源属性(1字节)•最大功率(1字节)•报告描述符中的辅助 HID 用法 ID (3字节)"

    外部 ROM 数据(样本集)

    0xBB,0x08,0x04,0x27,  供应商 ID:0x08BB,  产品 ID:0x2704   

    0x50,0x72,0x6f,0x64,0x75, 0x63,0x74,0x20,0x73,0x74, 0x72,0x69,0x6E,0x67,0x73, 0x2E,   产品字符串:产品字符串(16字节)  

    0x56,0x65,0x6E,0x64,0x6f, 0x72,0x20,0x73,0x74,0x72, 0x69,0x6E,0x67,0x73,0x20, 0x61,

    0x72,0x65,0x20,0x70,0x6C, 0x61,0x63,0x65,0x64,0x20, 0x68,0x65,0x72,0x65,0x2E, 0x20,  供应商字符串:此处放置供应商字符串(32字节,31个可见字符后跟1个空格)

    0x80,    电源属性(bmAttribute):0x80 (总线供电)

    0x7D,    最大功率(最大功率):0x7D  

    0x0A,0x93,0x01   辅助 HID 用法 ID:0x0A,0x93,0x01 (AL A/V 捕获)

    解释数据从地址0x00开始存储

    请注意,数据位必须通过 I 2C 总线从 LSB 发送到 MSB。 因此,每个数据字节必须以相反顺序存储其位