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.

[参考译文] SMARTRF06EBK:CC2538无法从 MISO 引脚读取 SPI 数据

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/741906/smartrf06ebk-with-cc2538-not-able-to-read-spi-data-from-miso-pin

器件型号:SMARTRF06EBK
主题中讨论的其他器件:CC2538CC2530

您好!

我已将 M95M01 EEPROM 与 CC2538连接到我的 SmartRF06板、无法通过 SSI 的 MISO 引脚读取数据。

尽管我能够在 MOSI 引脚上传输数据、并且可以在逻辑分析仪上查看数据和芯片选择引脚、下面是我的初始化。 我已在 CC2530上成功完成 EEPROM 接口。 现在、我将在 CC2538上移植相同的内容。 下面是我对 SSI 的初始化

#define PIN_SSI_CLK GPIO_PIN_2
#define PIN_SSI_FSS GPIO_PIN_3
#define PIN_SSI_RX GPIO_PIN_4
#define PIN_SSI_TX GPIO_PIN_5

SysCtrlClockSet (false、false、SYS_CTRL_SYSDIV_32MHz);

SysCtrlIOClockSet (SYS_CTRL_SYSDIV_32MHz);

SysCtrlPeripheralEnable (SYS_CTRL_Periph_SSI0);

SSIDisable (SSI0_BASE);

SSIClockSourceSet (SSI0_BASE、SSI_Cock_PIOSC);

IOCPinConfigPeriphOutput (GPIO_A_base、PIN_SSI_CLK、IOC_MUX_OUT_SEL_SSI0_CLKOUT);

IOCPinConfigPeriphOutput (GPIO_A_base、PIN_SSI_FSS、IOC_MUX_OUT_SEL_SSI0_FSSOUT);

IOCPinConfigPeriphOutput (GPIO_A_base、PIN_SSI_TX、IOC_MUX_OUT_SEL_SSI0_TXD);

IOCPinConfigPeriphInput (GPIO_A_base、PIN_SSI_RX、IOC_SSIRXD_SSI0);

GPIOPinTypeSSI (GPIO_A_base、(PIN_SSI_CLK | PIN_SSI_FSS | PIN_SSI_RX | PIN_SSI_TX);

SSIConfigSetExpClk (SSI0_BASE、SysCtrlIOClockGet ()、SSI_FRF_MOTO_MOTO_3、SSI_MODE_MASTER、SysCtrlClockGet ()/8、 8);
SSIEnable (SSI0_BASE);

如果我的初始化错误或任何其他问题、请帮助我。

谢谢、

此致、

Akshay B

 

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

    您是否在 SCLK 引脚上看到时钟信号?

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

    在逻辑分析仪上、我无法在接收数据时看到时钟、但在发送时能够看到时钟。

    谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当接收数据时、SCLK 应该在那里。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用了 SSI 驱动程序库中的 SSIDataGet () API 来接收数据

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

    您好、akshay、

    正如黄凯文提到的,当您接收或传输数据时,SCLK 应该处于活动状态。
    请在发送和接收时分享您的逻辑分析仪的屏幕截图、以供进一步分析。 其他代码片段也会有所帮助。

    您是否已验证基础固件中的 SPI 示例是否正常工作( www.ti.com/.../CC2538-SW )?  我建议从此处开始并根据您的项目修改它。


    此致、
    Toby

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

    尊敬的 Toby:

    我已在基础固件中附加了 SPI 示例的逻辑分析仪屏幕截图。 在这里、我能够发送数据"S""p"i""i"、正如您从 SPI 发送屏幕截图1和 SPI 发送屏幕截图2图像中看到的那样。

    对于接收代码、我无法看到任何没有时钟的东西、也无法看到您在 SPI 接收屏幕快照图像中看到的片选。 尽管我能够在我的 PA4和 PA5 引脚板中看到 UART 上的接收数据。

    SPI 发送屏幕截图1.

    SPI 发送屏幕截图2.

    SPI 接收屏幕截图

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是预期的行为。 由于 MOSI 短接至 MISO、因此在发送它们的同时接收"S"、"P"和"i"(正如您在前两个屏幕截图中看到的 MISO 活动)。 在这种情况下、SSIDataGet 会发现 FIFO 中有数据并从中进行读取。

    请验证在连接另一个器件时、您是否在 MISO 上看到类似的活动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Toby:

    很抱歉、由于我正在测试、但仍然无法在 MISO 引脚上接收数据、下面是我的初始化是否可以检查并告诉我 SPI 主器件的初始化是否正确

    SysCtrlClockSet (false、false、SYS_CTRL_SYSDIV_32MHz);

    SysCtrlIOClockSet (SYS_CTRL_SYSDIV_32MHz);
    SysCtrlPeripheralEnable (SYS_CTRL_Periph_SSI0);
    SSIDisable (SSI0_BASE);//在配置模块之前禁用 SSI 功能
    SSIClockSourceSet (SSI0_BASE、SSI_CLOCK _PIOSC);//将 IO 时钟设置为 SSI 时钟源

    IOCPinConfigPeriphOutput (GPIO_A_base、PIN_SSI_CLK、IOC_MUX_OUT_SEL_SSI0_CLKOUT);
    IOCPinConfigPeriphOutput (GPIO_A_base、PIN_SSI_TX、IOC_MUX_OUT_SEL_SSI0_TXD);
    IOCPinConfigPeriphInput (GPIO_A_base、PIN_SSI_RX、IOC_SSIRXD_SSI0);

    GPIOPinTypeSSI (GPIO_A_base、(PIN_SSI_CLK | PIN_SSI_RX | PIN_SSI_TX);

    SSIConfigSetExpClk (SSI0_BASE、SysCtrlIOClockGet ()、SSI_FRF_MOTO_MOTO_3、SSI_MODE_MASTER、SysCtrlClockGet ()/16、 8);
    SSIEnable (SSI0_BASE);
    GPIODirModeSet (GPIO_A_base、GPIO_PIN_1、GPIO_DIR_MODE_OUT);// M95M01的芯片选择引脚
    GPIOPinWrite (GPIO_A_base、GPIO_PIN_1、0xFF);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于您在控制应用程序(PA1)中的片选引脚、请确保在启动 SSI 传输前将其设为低电平。

    当您尝试连接到您的器件时、请向我们发送逻辑分析仪屏幕截图。
    在以下帖子 中与 CC2530进行交互时、将这些屏幕截图与逻辑分析仪屏幕截图进行比较也很有用:e2e.ti.com/.../734024
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Toby:

    在发送和接收数据时、我已经注意芯片选择引脚、但仍然无法接收。

    正如您在随附的逻辑分析仪屏幕截图中看到的、我将命令和地址发送到 EEPROM 芯片、EEPROM 芯片应返回该地址的数据、但在 MISO 引脚上未显示任何内容、也未显示时钟。 我还将共享接收代码。

    GPIOPinWrite (GPIO_A_base、GPIO_PIN_1、0x00);
    SSIDataPut (SSI0_BASE、CMD_READ);
    SSIDataPut (SSI0_BASE、(PAGE_START_ADDRESS>16)& 0xFF);
    SSIDataPut (SSI0_BASE、(PAGE_START_ADDRESS>8)& 0xFF);
    SSIDataPut (SSI0_BASE、(PAGE_START_ADDRESS & 0xFF);
    while (SSIBusy (SSI0_BASE));

    SSIDataGet (SSI0_BASE、STATUS);

    GPIOPinWrite (GPIO_A_base、GPIO_PIN_1、0xFF);

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

    问题是、由于我没有使用虚拟发送 SSIDataPut 使用 SSIDataGet 接收数据。 还需要在 SSIDataGet 之后应用50 SysCtrlDelay (50)的延迟以实现正确的输出。

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

    尊敬的 Toby:

    我能够在逻辑分析仪上看到从器件(EEPROM)读取的数据、但代码中的变量不会根据数据进行更新、它显示为0x000000、因为它是 int。

    附加逻辑分析仪的屏幕截图。 在这里、您可以看到读取的数据为0x78 0x00 0x00 0x00

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

    您是否正在尝试从接收 FIFO 读取4个字节并将其存储到一个 int 中? 如果是、您可能会覆盖 int。

    在 SPI 初始化中、您使用的是8位数据宽度、因此每个 SSIDataGet 将从接收 FIFO 中检索一个字节。
    如果您希望获得全部4个字节、请尝试如下所示:

    uint32_t dummyData = 0;
    uint32_t rxByte[4];
    
    SSIDataPut (SSI0_BASE、&dummyData);
    SSIDataGet (SSI0_BASE、 &rxByte[0]);
    
    SSIDataPut (SSI0_BASE、&dummyData);
    SSIDataGet (SSI0_BASE、&rxByte[1]);
    
    SSIDataPut (SSI0_BASE、&dummyData);
    SSIDataGet (SSI0_BASE、&rxByte[2]);
    
    SSIDataPut (SSI0_BASE、 &dummyData);
    SSIDataGet (SSI0_BASE、&rxByte[3]); 

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

    我将执行以下相同的操作、是我的代码

    uint32_t One;
    uint32_t two;
    uint32_t three;
    uint32_t four;

    GPIOPinWrite (GPIO_A_base、GPIO_PIN_2、0x00);
    SSIDataPut (SSI0_BASE、MSB);
    SSIDataPut (SSI0_BASE、LSB);

    SSIDataPut (SSI0_BASE、ADE7953_READ); //发送命令以开始读取
    while (SSIBusy (SSI0_BASE))



    SSIDataPut (SSI0_BASE、0x00);
    SSIDataGet (SSI0_BASE、&1);
    SSIDataPut (SSI0_BASE、0x00);
    SSIDataGet (SSI0_BASE、&two);
    SSIDataPut (SSI0_BASE、0x00);
    SSIDataGet (SSI0_BASE、&three);
    SSIDataPut (SSI0_BASE、0x00);
    SSIDataGet (SSI0_BASE、&four);
    SysCtrlDelay (50);
    GPIOPinWrite (GPIO_A_base、GPIO_PIN_2、0xFF);

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

    需要在 SPI 数据获取之前添加 SSIDataGetNonBlocking。

    while (SSIDataGetNonBlocking (SSI0_BASE、temp_arr))