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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/679634/ccs-tms320f28377s-spi-problem

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

你(们)好

我尝试通过具有外部闪存(Microchip SST26VF064B)的 SPI 进行连接、但遇到了问题。 当我尝试读取存储器的 ID 时、我不会得到我应该得到的结果。 有人可以帮助我解决这个问题吗?

#include "F28x_Project.h"

void delay_loop (void);
void SPI_xmit (uint16 a);
void SPI_fifo_init (void);
void SPI_init (void);
void error (void);

void main (void)
{
uint16 sdata;//发送数据
uint16 RDATA;//接收到的数据

InitSysCtrl();

GpioDataRegs.GPBCLEAR .BIO63 = 1;

InitSpiaGpio();
InitSpi();
DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable ();



// sdata = 0x009F;

for (;)
{
GpioDataRegs.GPCCLEAR.bit.GPIO64=1;

SPI_Xmit (0x9F);
RDATA = SpiaRegs.SPIRXBUF;


GpioDataRegs.GPCSET.BIPOL64 = 1;



}


void error (void)
{
asm (" ESTOP0"); //测试失败!! 停下来!
对于(;;);
}

void SPI_xmit (uint16 a)
{
SpiaRegs.SPITXBUF = A;
}
//######################################################################################################################
//
//文件:F2837xS_SPI.c
//
//标题:F2837xS SPI 初始化和支持函数。
//
//##########################################################################################################################
//$TI 发行版:F2837xS 支持库 v3.04.00.00 $
//$发行 日期:Sun Mar 25 13:27:27 CDT 2018 $
//版权所有:
//版权所有(C) 2014-2018 Texas Instruments Incorporated - http://www.ti.com/
//

只要
满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//:
//
//重新分发源代码必须保留上述版权
//声明、此条件列表和以下免责声明。
//
//二进制形式的再发行必须复制上述版权
//声明、此条件列表和//

分发随附的//文档和/或其他材料中的以下免责声明。
////
未经

事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
////
本软件由版权所有者和贡献者提供
//“按原样”,不

承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
//所有者或贡献者都不对任何直接、间接、偶然、
//特殊、模范、 或相应的损害(包括但不
限于采购替代产品或服务;丧失使用、
//数据或利润; 或业务中断)、无论

出于何种原因使用
本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
//$
//########################################################################################################################

//
//包含的文件
//
#include "F2837xS_device.h"
#include "F2837xS_examples.h"

//
计算 BRR:7位波特率寄存器值
// SPI CLK freq = 500kHz
// LSPCLK freq = CPU freq /4 (默认)
// BRR =(LSPCLK 频率/ SPI CLK 频率)- 1
//
#if CPU_FRQ_200MHz
#define SPI_BRR (((200E6 / 4)/ 500E3)- 1
#endif

CPU_FRQ_150MHz
#define SPI_BRR (((150E6 / 4)/ 500E3)- 1
#endif

CPU_FRQ_120MHz
#define SPI_BRR (((120E6 / 4)/ 500E3)- 1
#endif

//
InitSPI -此函数将 SPI 初始化为已知状态
//
void InitSpi (void)
{
//初始化 SPI-A

//在配置更改之前将 RESET 设置为低电平
//时钟极性(0 =上升、1 =下降)
// 16位字符
//启用环回
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR =(7);
SpiaRegs.SPICCR.bit.SPILBK = 0;

//启用主设备(0 =从设备,1 =主设备)
//启用传输(TALK)
//时钟相位(0 =正常、1 =延迟)
//禁用 SPI 中断
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 = SPI_BRR;

//设置空闲位
//在断点上停止不会停止 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;

//解除 SPI 复位
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}//


InitSpiGpio -此函数初始化 GPIO 引脚以用作 SPI 引脚。
// 每个 GPIO 引脚可配置为 GPIO 引脚或最多3
// 不同的外设功能引脚。 默认情况下、所有引脚均为
// 复位后作为 GPIO 输入。
//
// 注意:
// 每个 SPI 外设//
对于 SPISOMO 运行、只应启用一个 GPIO 引脚。
// 对于 SPISOMI 运行、只应启用一个 GPIO 引脚。
// 对于 SPICLK 运行、只应启用一个 GPIO 引脚。
// SPISTE 操作只应启用一个 GPIO 引脚。
// 注释掉其他不需要的行。
//
void InitSpiGpio()
{InitSpiaGpio()
;
}//


InitSpiaGpio -初始化 SPIA GPIO
//
void InitSpiaGpio()
{EALLOW
;

//
//为所选引脚启用内部上拉
//
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 GPIO16上的上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)


//
//仅将所选引脚的限定条件设置为异步
//

//注释掉其他不需要的行。
//
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO18 (SPICLKA)


//
//使用 GPIO 寄存器配置 SPI-A 引脚
//
//这指定哪些可能的 GPIO 引脚将是 SPI 功能
//引脚。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA


GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0;//启用 GPIO58上的上拉电阻器(SPISTEA)
GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 0;// 0=GPIO、1=MCLKRA、2=SCITXDB、3=EPWM7A
GpioCtrlRegs.GPCDIR.bit.GPIO64=1; // 1=输出,0=输入
// GpioDataRegs.GPCSET.BIT.GPIO64 = 1; //取消注释 if ->初始设置为高电平

GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;//启用 GPIO58上的上拉电阻(WP)
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0;// 0=GPIO、1=MCLKRA、2=SCITXDB、3=EPWM7A
GpioCtrlRegs.GPBDIR.bit.GPIO63 = 1; // 1=输出,0=输入
// GpioDataRegs.GPBSET.BIO63 = 1; //取消注释 if ->初始设置为高电平

EDIS;
}

////
文件结束
// 

此致

Szymon

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

    您好、Szymon、

    您能告诉我们您希望接收哪些数据,以及您实际接收了哪些数据吗?

    -您的 SPI 通信以多高的频率运行?

    -您是否已验证 C28x 上编程的时钟和相位设置是否与外部存储器数据表中指定的设置相匹配?

    此致、

    Kris

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

    你(们)好、Kris

    我应接收 BFH 26H 43H。  我的频率为500kHz。 是的、我已验证时钟和相位设置。 随附更正后的代码。

    #include "F28x_Project.h"
    
    void delay1_loop (void);
    void SPI_xmit (uint16 a);
    void SPI_fifo_init (void);
    void error (void);
    void InitMySpi (void);
    void InitSpiGpioMy();
    void main (void)
    {
    uint16 sdata;//发送数据
    uint16 RDATA;//接收到的数据
    
    InitSysCtrl();
    
    DINT;
    
    InitSpiGpioMy();
    
    InitPieCtrl();
    
    IER = 0x0000;
    IFR = 0x0000;
    
    InitPieVectTable ();
    
    InitMySpi ();
    SPI_Fifo_init ();
    
    // sdata = 0x009F;
    for (;)
    {
    SPI_xmit (0x009F);//transmija
    delay1_loop();
    while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
    
    RDATA = SpiaRegs.SPIRXBUF;//odczyt
    
    }
    
    
    
    void delay1_loop ()//delay
    {
    长 I;
    对于(i = 0;i < 1000000;i++){}
    
    
    
    void error (void)
    {
    asm (" ESTOP0");
    对于(;;);
    }
    
    
    void SPI_xmit (uint16 a)//transmisja
    {
    SpiaRegs.SPITXBUF = A;
    }
    
    
    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;//启用 GPIO16上的上拉电阻器(SPISIMOA)
    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)
    GpioCtrlRegs.GPCPUD.bit.GPIO72 = 0;//启用 GPIO19上的上拉电阻器(SPISTEA)
    
    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO18 (SPICLKA)
    GpioCtrlRegs.GPCQSEL1.bit.GPIO72 = 3;//异步输入 GPIO19 (SPISTEA)
    
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA
    GpioCtrlRegs.GPCMUX1.bit.GPIO72=3;//将 GPIO19配置为 SPISTEA
    
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA
    GpioCtrlRegs.GPCGMUX1.bit.GPIO72=3;//将 GPIO19配置为 SPISTEA
    
    EDIS;
    }
    
    

    此致  

    Szymon

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

    您实际接收的数据是什么? 我想将其与预期数据进行比较、看看是否存在位移或其他可识别的模式。

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

    您好!

    我收到了0xFFFF

    此致  

    Szymon

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

    这听起来像是另一个器件未在发送、或者多路复用器上的 RX GPIO 配置不正确。

    您能否确认您使用 GPIO 58/59/60/72进行 SPI 连接? GPIO72的 SPISTEC 实际上用于与其他信号不同的 SPI 模块。 该器件具有多个 SPI。 所有其他信号都用于 SPI-A、因此您要使用的信号是 SPISTE"A"。 可能会发生的情况是、从器件发送使能未设置为低电平以允许从器件发送。 因此、您将接收全部为1、因为您的 SOMI 引脚被拉高。

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

    你(们)好  

    我更改了配置、但仍然没有收到正确的值。  我检查了示波器上的信号波形。 对于 MOSI、CLK 和 SPISTE"a"单格、波形被校正。 当您写入时、当主机开始传输时、SPISTE "A"将状态从0更改为1。

     在 MISO 信号上、我始终具有高电平。

    #include "F28x_Project.h"
    
    void delay1_loop (void);
    void SPI_xmit (uint16 a);
    void SPI_fifo_init (void);
    void error (void);
    void InitMySpi (void);
    void InitSpiGpioMy();
    void main (void)
    {
    uint16 sdata;//发送数据
    uint16 RDATA;//接收到的数据
    
    InitSysCtrl();
    
    DINT;
    
    InitSpiGpioMy();
    
    InitPieCtrl();
    
    IER = 0x0000;
    IFR = 0x0000;
    
    InitPieVectTable ();
    
    InitMySpi ();
    SPI_Fifo_init ();
    
    // sdata = 0x009F;
    for (;)
    {
    SPI_xmit (0x009F);//transmija
    delay1_loop();
    while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
    
    RDATA = SpiaRegs.SPIRXBUF;//odczyt
    
    }
    
    
    
    void delay1_loop ()//delay
    {
    长 I;
    对于(i = 0;i < 1000000;i++){}
    
    
    
    void error (void)
    {
    asm (" ESTOP0");
    对于(;;);
    }
    
    
    void SPI_xmit (uint16 a)//transmisja
    {
    SpiaRegs.SPITXBUF = A;
    }
    
    
    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.GPAPUD.bit.GPIO16 = 0;//启用 GPIO16上的上拉电阻器(SPISIMOA)
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;//启用 GPIO19上的上拉电阻器(SPISTEA)
    
    GpioCtrlRegs.GPAQSEL2.bit.GPIO16=3;//异步输入 GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入 GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;//异步输入 GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;//异步输入 GPIO19 (SPISTEA)
    
    GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;//将 GPIO16配置为 SPISIMOA
    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;//将 GPIO17配置为 SPISOMIA
    GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;//将 GPIO18配置为 SPICLKA
    GpioCtrlRegs.GPAMUX2.bit.GPIO19=1;//将 GPIO19配置为 SPISTEA
    
    EDIS;
    } 

    此致

    Szymon

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

    您好、Szymon、

    我只想确认、当主器件正在发送时、SPISTE 应该为低电平。 您能确认情况吗? 如果是、TI 器件似乎按编程方式工作。 我建议进一步查看 Microchip 数据表、以确保您与正确的引脚通信并正确配置通信。

    此致、

    Kris