工具与软件:
大家好、团队成员:
。
使用 tSPI 协议进行寄存器读取和写入时、我们发现写入的数据与读取的数据不一致
1) NSLEEP 下拉->上拉
2) PWM_SYNC ->上拉
3) 3)寄存器写入和读取
能不能帮我弄清楚原因是什么?
原理图和通信程序如下所示:
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.
尊敬的 Reed:
当您认为 SPI 写入数据和读取数据不一致时、您可以进行详细阐述吗? 您是否正在使用逻辑分析仪? 您是否有一些阅读和写作的屏幕截图?
您在使用什么 MCU 和 IDE? 在实际查看代码方面、我可能没有多大帮助 、但这里是 tSPI 如何使用 LAUNCHXL - 280049C 和 CCS 针对 DRV8311工作的片段
Uint16 tspi_read_block(Uint16 id, Uint16 addr, Uint16 data_size)
{
Uint16 p_addr;
Uint16 p_data;
Uint16 commandword;
Uint16 dummy = 0;
p_addr = spi_parity_calc(addr);
commandword = (0x8000) | (id << 11) | (addr << 3) | (p_addr << 0);
SpiaRegs.SPITXBUF=commandword;
int data_ptr;
for (data_ptr = 0; data_ptr < data_size; data_ptr++)
{
p_data = spi_parity_calc(dummy);
commandword = (p_data << 15) | dummy;
SpiaRegs.SPITXBUF=commandword;
spi_data_tx[data_ptr] = SpiaRegs.SPIRXBUF;
}
while(SpiaRegs.SPIFFRX.bit.RXFFST != data_size);
return SpiaRegs.SPIRXBUF;
}
Uint16 tspi_write_block(Uint16 id, Uint16 addr, Uint16 data_size, Uint16 data[])
{
Uint16 p_addr;
Uint16 p_data;
Uint16 commandword;
p_addr = spi_parity_calc(addr);
commandword = (id << 11) | (addr << 3) | (p_addr << 0);
SpiaRegs.SPITXBUF=commandword;
int data_ptr;
for (data_ptr = 0; data_ptr < data_size; data_ptr++)
{
p_data = spi_parity_calc(data[data_ptr]);
commandword = (p_data << 15) | data[data_ptr];
SpiaRegs.SPITXBUF=commandword;
}
while(SpiaRegs.SPIFFRX.bit.RXFFST != data_size);
return SpiaRegs.SPIRXBUF;
}
此致、
Yara
您好、Yara、
感谢您的及时回复、
按照您的建议、我填写了正确的奇偶校验位、但仍然有问题。
例如、我将数据写入 PWM_CTRL1寄存器、但当我再次读取 PWM_CTRL1的数据时、读出的数据不是我写入的数据。
还有一个问题、我们在使用 HiSilicon 3519主芯片组。 在构成 tSPI 帧数据后、我们使用 Linux SPI 总线通信协议来执行数据读取和写入操作、
这种方法是否可行?
尊敬的 Zhu:
在编写 tSPI 帧数据后、我们使用 Linux SPI 总线通信协议执行数据读写操作、
只要您牢记此器件的 SPI 要求、我就不会遇到此问题


您是否有逻辑分析仪? 您可以向我展示 SPI 通信的任何波形?
一个好的开始是读取所有寄存器、然后查看是否获得了默认值。 如果没有获得默认值、则 SPI 帧可能会出现问题。 请记住、您应使用 tSPI 帧、而不是数据表中的 SPI 帧。
此致、
Yara