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.

[参考译文] TMS320F28069:MCP23S17

Guru**** 2547030 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1030912/tms320f28069-mcp23s17

器件型号:TMS320F28069

通过 SPI 读取 MCp23S17时出现问题

我无法从 MCP23S17 I/O 扩展器读取数据,并且写入 I/O 扩展器的操作正常。

Uint16 SPI0_Write(Uint16 data)
{
Uint16 rdata=0;
SpibRegs.SPITXBUF=(data<<8);

while(SpibRegs.SPISTS.bit.INT_FLAG ==0) {} // Wait until data received

rdata = SpibRegs.SPIRXBUF;

return rdata;

}


unsigned char SPI0_Read()
{
unsigned int rxdata;
SpibRegs.SPITXBUF = 0x00; // Master transmits data
while(SpibRegs.SPISTS.bit.INT_FLAG ==0) {} // Wait until data received
rxdata = SpibRegs.SPIRXBUF; // dummy read to clear INT flag

return (rxdata);

}


void SPI_Init(void)
{

        SpibRegs.SPIPRI.bit.TRIWIRE =1;//3-wire Mode
        SpibRegs.SPICCR.bit.SPICHAR = 0x7; // 16-bit char bits
        SpibRegs.SPICCR.bit.CLKPOLARITY = 1;
        SpibRegs.SPICTL.bit.CLK_PHASE = 1;
        SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;
        SpibRegs.SPICTL.bit.TALK = 1; // Enable master mode, normal phase,
        // enable talk, and SPI int disabled.

        SpibRegs.SPIBRR = 63; // 15 -> 1Mbps
        SpibRegs.SPICCR.bit.SPISWRESET = 1; // Relinquish SPI from Reset
        SpibRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission


}


void MCP23S17_write(unsigned char address, unsigned char value)
{
    GpioDataRegs.GPADAT.bit.GPIO21=0;//CS ENABLE
    SPI0_Write(IO_DEVICE_ADDRESS_WRITE);
    SPI0_Write(address);
    SPI0_Write(value);
    GpioDataRegs.GPADAT.bit.GPIO21=1;//CS DISABLE
}


unsigned char MCP23S17_read(unsigned char address)
{
    unsigned char received_data = 0;
    GpioDataRegs.GPADAT.bit.GPIO21=0;//CS ENABLE
    SPI0_Write(IO_DEVICE_ADDRESS_READ);
    SPI0_Write(address);
    SPI0_Write(0x00);
    received_data = SpibRegs.SPIRXBUF;
    GpioDataRegs.GPADAT.bit.GPIO21=1;//CS DISABLE
    return received_data;
}

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

    您好!

    请提供更多信息吗? 您是否能够对从 MCP23S17发送的数据进行范围分析并确认它确实在向 F28069发送数据? 您已经等待接收到的数据的 SPI0_Write 函数、程序是否保持在 while 循环上?

    此致、

    Marlyn

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

    数据从芯片传入到 TMS 我已检查数据确实来自芯片、并在我向 MCP23S17应用输入时发生变化。

    是 SPI0_Write 函数循环旋转

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

    您好 Zenith、

    您能否尝试执行外部回送以查看是否可以读回发送的内容?

    此致、

    Marlyn

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

    您好!
      我确实运行了环回示例、它按预期运行、我还使用了另一个板并进行了同样的测试、写入端口引脚在两个上都成功、只是读取器件不提供任何东西。

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

    Zenith、

    是否可以从两侧看到通信的波形?  

    此外、您为什么选择使用 GPIO 作为芯片选择、而不是 SPISTE?

    此致、

    Marlyn

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

    嗨、Marlyn、
              我现在启动并运行了我的系统、波形在各个方面都表现良好。 问题在于我在 SPI 初始化期间执行的3线设置、因为硬件设置为4线模式而不是3线模式、这会导致 RXBUFF 不接收任何内容。
    感谢您说我尚未使用 SPISTE 进行 CS 清理、非常感谢您的支持。