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.

[参考译文] CC2538:SPI 闪存 sst26vf064ba

Guru**** 2542550 points
Other Parts Discussed in Thread: CC2538

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/669045/cc2538-spi-flash-sst26vf064ba

器件型号:CC2538

您好! 通过 I2C 解决 EEPROM 连接问题后、我将尝试通过 SPI 与串行闪存进行通信。 我有 一个来自 driverlib (SPI_master)的示例、并在我的板上对其进行了测试。 当我将 MISO 和 MOSI 连接在一起(回送)时、它工作正常。 为了使用 SPI 闪存 sst26vf064ba、我尝试转换此示例 、但未成功。 我在示波器上看到除 MISO 之外的所有需要的信号(CS、CLK、MOSI)、并在读取时获取0xFF 或0x0。 以下是我的代码:

//
//将时钟设置为直接从外部晶振/振荡器运行。
//(无外部32k osc、无内部 osc)
//
SysCtrlClockSet (false、false、SYS_CTRL_SYSDIV_32MHz);
//
将 IO 时钟设置为与系统时钟相同
//
SysCtrlIOClockSet (SYS_CTRL_SYSDIV_32MHz);
//
必须启用 SSI0外设使用。
//
SysCtrlPeripheralEnable (SYS_CTRL_Periph_SSI0);

//
配置模块前禁用 SSI 功能
//
SSIDisable (SSI0_BASE);

//
将 IO 时钟设置为 SSI 时钟源
//
SSIClockSourceSet (SSI0_BASE、SSI_Cock_PIOSC);

IOCPinConfigPeriphOutput (GPIO_SSI0_BASE、PIN_SCLK0、
IOC_MUX_OUT_SEL_SSI0_CLKOUT);

IOCPinConfigPeriphOutput (GPIO_SSI0_BASE、PIN_CS0、
IOC_MUX_OUT_SEL_SSI0_FSSOUT);

IOCPinConfigPeriphOutput (GPIO_SSI0_BASE、PIN_MOSI0、
IOC_MUX_OUT_SEL_SSI0_TXD);

IOCPinConfigPeriphInput (GPIO_SSI0_BASE、PIN_MISO0、
IOC_SSIRXD_SSI0);

GPIOPinTypeSSI (GPIO_SSI0_BASE、PIN_SCLK0 |
PIN_CS0 | PIN_MISO0 |
PIN_MOSI0);

//
//将 SSI 模块配置为 Motorola/Freescale SPI 模式3:
//极性= 1,SCK 稳定状态为高
//相位 = 1、数据在第一个时钟沿发生变化并在第二个时钟边沿发生捕捉
//字大小= 8位
//
SSIConfigSetExpClk (SSI0_BASE、SysCtrlIOClockGet ()、SSI_FRF_MOTO_MOTO_MODE 0、
SSI_MODE_MASTER、SysCtrlClockGet ()/2、8);

//
//启用 SSI0模块。
//
SSIEnable (SSI0_BASE);

//
//从 SSI 端口读取任何残留数据。 这样可确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这是在这里完成
//因为 SPI SSI 模式是全双工的,允许您
同时发送和//接收。 SSIDataGetNonBlocking 函数在
返回数据时返回//"true"、在未返回数据时返回"false"。
//“非阻塞”函数检查接收
FIFO 中是否有数据//如果没有数据,则不会“挂起”。
//
uint32_t data =0x0;
while (SSIDataGetNonBlocking (SSI0_BASE、&data)
){
}

int i=0;
while (1)
{
/*SSIDataPut (SSI0_BASE、0x5);
while (SSIBusy (SSI0_BASE));*
while (!SSIDataPutNonBlocking (SSI0_BASE、I))
{
}
/*SSIDataGet (SSI0_BASE,&data);
while (SSIBusy (SSI0_BASE));*
while (SSIDataGetNonBlocking (SSI0_BASE、&data))
{
}
如果(数据!= 0xFF)
{
int a=0;
}
I =(i+1)&0xFFFFFF;
} 

有人知道问题在哪里? 请提供一些建议。

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

    我假设您从 CC2538基础固件包的 SPI_MASTER 示例中获取。 您能否提供 SPI 线路的逻辑分析仪或示波器屏幕截图? 您以前是否成功地与 ssst26vf064ba 通信? 您使用的是 EVM 还是定制 PCB? 您是否确信 sst26vf064ba 引脚已正确连接?

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

    您好、Ryan、

    感谢您的回答! 是的、我将从 CC2538基础固件包的 SPI_MASTER 示例中获取。 下面是我的示波器屏幕截图:首先发送0x1值、其次发送0x5值。 它们上有两条线- SDA 和 MOSI。 CS 线路也正常-时钟运行时为低电平、而不运行时为高电平。 但 MISO 线路是空的。

    我还没有使用过 sst26vf064ba。 您是否有此闪存的示例? 或者可能使用类似这样的其他闪存。 引脚已正确连接 - WP 并保持在+3VD、MOSI 从 CC2538连接到闪存上的 SI、MISO -连接到 SO、SCLK -连接到 SCK。

    此致、

    Alex

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

    请参阅 SST26VF064BA 数据表的第5.3和5.29节。 您需要发送读取指令并驱动 SCLK (SPI 是同步的)以接收位。 写入状态寄存器命令(01h)不会驱动 MISO 线路、但只要遵循图5-29、读取状态寄存器命令(05h)就会产生一些结果。 这包括监控您的 CE#线路。

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

    嗨、Ryan!

    感谢您的回答! 我了解到我们必须向闪存发送一些命令、以便使其在 MISO 行上设置字节。 现在我尝试读取 JEDEC ID (第5.14节)、但它仅在第二次尝试时有效。 您能告诉我它有什么问题吗? 这是我的代码。

     SSIConfigSetExpClk (SSI0_BASE、SysCtrlIOClockGet ()、SSI_FRF_MOTO_MODE_3、  
     SSI_MODE_MASTER、SysCtrlClockGet ()/16、8);

    CE_SetLow();/*启用器件*/
    int i=0;
    int j=0;
    int k=0;
    SSIDataPut (SSI0_BASE、0x9F);
    操作
    {
    SSIDataPut (SSI0_BASE、0xFF);
    SSIDataGet (SSI0_BASE、(uint32_t*) manufacturer_ID);
    i++;
    }
    while (* manufacturer_ID!=0xBF);
    操作
    {
    SSIDataPut (SSI0_BASE、0xFF);
    SSIDataGet (SSI0_BASE、(uint32_t*) Device_Type);
    J++;
    }
    while (* Device_Type!= 0x26);
    操作
    {
    SSIDataPut (SSI0_BASE、0xFF);
    SSIDataGet (SSI0_BASE、(uint32_t*) Device_ID);
    K++;
    }
    while (* Device_ID!=0x43);
    CE_SetHigh();//禁用设备*/ 

    结果正确、但第一个计数器 i=2。 这意味着、当我们第一次读取时、结果为0xFF、第二次读取时、结果为0xBF。 计数器 j=k=1的值。

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

    在0x9F 和 buffer (0xFF) SSIDataPut 命令之间可能没有足够的时间。 插入延迟或等待、直到 SPI 缓冲器为空、然后再发送缓冲器。 请继续使用示波器来查看数据线。

    此致、
    Ryan