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.

[参考译文] CCS/TMS320F28377S:具有闪存存储器探测的 SPI

Guru**** 2611705 points
Other Parts Discussed in Thread: TMS320F28377S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/691465/ccs-tms320f28377s-spi-with-flash-memory-probelm

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

你(们)好  

我将 TMS320F28377S 与外部闪存  SST26VF064B-104V/SM 搭配使用、并且 ID 读取出现问题。

读取过程如下所示: 
-主机发送0x9F 以开始读取 ID
主器件发送虚拟字节
—Salve 发送三个 ID 字节
-主读取 ID 字节。

我有一个问题,读数程序应该是什么样的?
在哪里我可以写入0x9F 和虚拟字节? SPITxBUF 或 SPIDAT?
我附加了我的代码、但它不起作用。
在 SPITXBUF 中、SPIRXBUF 和 SPIDAT I 始终具有0xFFFF。

感谢你的帮助

此致
Szymon
#include "F28x_Project.h"

void delay1_loop (void);
void SPI_xmit (uint16 a);
void SPI_fifo_init (void);
void InitMySpi (void);
void InitSpiGpioMy ();




UINT16 Flash_SpiTransmit (UINT16数据)
{
uint16 i = 0;
对于(I = 0;I < 2;+I)

ASM (" NOP");

SpiaRegs.SPITXBUF =数据;

对于(I = 0;I < 2;+I)
ASM (" NOP");

返回(UINT16) SpiaRegs.SPITXBUF;
}

UINT16 Flash_SpiReceive (UINT16 DataToTransmit)
{
uint16 i = 0;

对于(I = 0;I < 2;+I)
ASM (" NOP");

SpiaRegs.SPIDAT = DataToTransmit;

对于(I = 0;I < 2;+I)
ASM (" NOP");

返回(UINT16) SpiaRegs.SPITXBUF;
}

UINT16 Tab[3];
UINT16 statusRegister;
UINT16 configRegister;
UINT16 tabConfig[2];
UINT16 dataSend[256];
UINT16数据接收器[256];

void FlashReadJedec (void)
{
uint16 i = 0;
EALLOW;

GpioDataRegs.GPACLEAR.bit.GPIO12=1;/CS na 0
EDIS;
ASM (" NOP");
对于(I = 0;I < 100;+I)
ASM (" NOP");
Flash_SpiTransmit (0x9F);//命令读取 JEDEC

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
Flash_SpiReceive (0x00);
TAB[0]= SpiaRegs.SPIRXBUF;
TAB[1]= SpiaRegs.SPIRXBUF;
TAB[2]= SpiaRegs.SPIRXBUF;

对于(I = 0;I < 100;+I)
ASM (" NOP");
EALLOW;
GpioDataRegs.GPASET.bit.GPIO12=1;/CS na 1.
EDIS;
}

void main (void)
{
InitSysCtrl();
DINT;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

// InitSpiaGpio();
InitSpiGpioMy();
InitMySpi();
SPI_Fifo_init();

while (1)
{

FlashReadJedec;
uint16 a = tab[0];
uint16 b = tab[1];
uint16 c = tab[2];

}



void spi_fifo_init ()
{
SpiaRegs.SPIFFTX.ALL = 0xE040;
SpiaRegs.SPIFFRX.ALL = 0x2044;
SpiaRegs.SPIFFCT.all = 0x0;
}

void InitMySpi (void)
{
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR =(16-1);
SpiaRegs.SPICCR.bit.SPILBK = 0;

SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA=0;
//设置波特率
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 99;
SpiaRegs.SPIPRI.bit.FREE = 1;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;


}

void InitSpiGpioMy ()
{
EALLOW;


GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//(SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//(SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//(SPICLKA)

GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//(SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//(SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//(SPICLKA)

GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;// SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;// SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;// SPICLKA

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;// SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;// SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;// SPICLKA

GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 1;// CS
GpioDataRegs.GPASET.bit.GPIO12=1;

GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;
GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;// WP
GpioDataRegs.GPASET.bit.GPIO13 = 1;

GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;//保持
GpioDataRegs.GPASET.bit.GPIO14=1;

EDIS;
}

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在示波器上、我可以看到 MOSI、CLK 信号和芯片选择信号上的帧、但在 MISO 上、我看到高电平条件
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然会对 SPITXBUF 执行虚拟写入。 您需要为要接收的每个字节发送一个字节、即三个字节、对吧? 发送0x9F 命令后、我只会看到一个。

    此外、存储器器件是否需要8位字节? 您的字符长度似乎设置为16位。 如果您确实需要将其切换为8位、请确保您还添加了移位数据、以便在 SPITXBUF 寄存器中将其左对齐。

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

    你(们)好


    我已将您的建议添加到代码中、但我仍有相同的问题。 在 SPIRXBUF 寄存器中、我一直将0x00FF 置为高电平、MISO 引脚上的值是多少?

    您是否知道它为什么不起作用?

    我附上校正后的程序代码和示波器波形的图像

    感谢你的帮助

    此致

    Szymon  

    #include "F28x_Project.h"
    
    void delay1_loop (void);
    void SPI_xmit (uint16 a);
    void SPI_fifo_init (void);
    void InitMySpi (void);
    void InitSpiGpioMy ();
    
    
    
    
    UINT16 Flash_SpiTransmit (UINT16数据)
    {
    uint16 i = 0;
    对于(I = 0;I < 2;+I)
    
    ASM (" NOP");
    
    SpiaRegs.SPITXBUF =数据<<8;
    
    对于(I = 0;I < 2;+I)
    ASM (" NOP");
    
    //返回(uint16) SpiaRegs.SPITXBUF;
    }
    
    
    
    uint16选项卡[4];
    
    
    void FlashReadJedec (void)
    {
    uint16 i = 0;
    EALLOW;
    GpioDataRegs.GPACLEAR.bit.GPIO19=1;
    EDIS;
    ASM (" NOP");
    对于(I = 0;I < 5;+I)
    ASM (" NOP");
    Flash_SpiTransmit (0x9F);//命令读取 JEDEC
    while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
    Tab[0]= SpiaRegs.SPIRXBUF>>8;
    Flash_SpiTransmit (0x00);
    while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
    Tab[1]= SpiaRegs.SPIRXBUF>>8;
    Flash_SpiTransmit (0x00);
    while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
    tab[2]= SpiaRegs.SPIRXBUF>>>8;
    Flash_SpiTransmit (0x00);
    while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
    Tab[3]= SpiaRegs.SPIRXBUF>>8;
    
    对于(i = 0;i < 5;++I)
    ASM (" NOP");
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO19=1;
    EDIS;
    }
    
    void main (void)
    {
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    
    IER = 0x0000;
    IFR = 0x0000;
    
    InitPieVectTable();
    
    // InitSpiaGpio();
    InitSpiGpioMy();
    InitMySpi();
    SPI_Fifo_init();
    
    while (1)
    {
    
    FlashReadJedec;
    uint16 a = tab[0];
    uint16 b = tab[1];
    uint16 c = tab[2];
    
    }
    
    
    
    void spi_fifo_init ()
    {
    SpiaRegs.SPIFFTX.ALL = 0xE040;
    SpiaRegs.SPIFFRX.ALL = 0x2044;
    SpiaRegs.SPIFFCT.all = 0x0;
    }
    
    void InitMySpi (void)
    {
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICCR.bit.SPICHAR =(7);
    SpiaRegs.SPICCR.bit.SPILBK = 0;
    
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    SpiaRegs.SPICTL.bit.TALK = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    SpiaRegs.SPICTL.bit.SPIINTENA=0;
    //设置波特率
    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 99;
    SpiaRegs.SPIPRI.bit.FREE = 1;
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    
    
    }
    
    void InitSpiGpioMy ()
    {
    EALLOW;
    
    
    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//(SPISIMOA)
    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//(SPISOMIA)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//(SPICLKA)
    
    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//(SPISIMOA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//(SPISOMIA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//(SPICLKA)
    
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;// SPISIMOA
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;// SPISOMIA
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;// SPICLKA
    
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;// SPISIMOA
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;// SPISOMIA
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;// SPICLKA
    
    GpioCtrlRegs.GPAMUX2.bit.GPIO19=0;
    GpioCtrlRegs.GPADIR.bit.GPIO19=1;// CS
    GpioDataRegs.GPASET.bit.GPIO19=1;
    
    GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;
    GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;// WP
    GpioDataRegs.GPASET.bit.GPIO13 = 1;
    
    GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
    GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;//保持
    GpioDataRegs.GPASET.bit.GPIO14=1;
    
    
    
    
    
    EDIS;
    } 





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

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

    我找到了问题的原因。
    我必须设置:SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;

    感谢你的帮助
    此致
    Szymon