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.

[参考译文] TMS320F28379D:用于 SPI-B 的 SPI 回送

Guru**** 2586895 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/898029/tms320f28379d-spi-loopback-for-spi-b

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

您好!

我尝试将 C2000Ware SPI 环回中的示例提供配置为使用 SPI-B 而不是 SPI-A  我需要在最终设计中同时使用 SPI-A 和 SPI-B、因此我正在尝试确保我了解如何正确配置它们。   我使用的是 F28379D 实验套件。  我已经确认、如果我使用 SPI-A 提供的代码、一切正常。  我将使用示波器(GPIO 18)测量引脚71、我可以看到时钟。  然后、我尝试配置 SPI-B、在引脚79 (GPIO 79) SPIB-clk 上看不到任何内容。  我已更改 Example_2837xDSpi_FFDLB.c 和 F2837xD_SPI.c、请参阅下面的内容。  要使用 SPI-B、我还需要更改其他内容吗?  感谢您的任何帮助。

//######################################################################################################################
//
//文件:example_2837xDSpi_FFDLB.c
//
//标题:SPI 数字环回程序。
//
//! addtogroup cpu01_example_list
//!

SPI 数字回路(SPI_LOOP)


//!
//! 该程序使用外设的内部回路测试模式。
//! 而不是引导模式引脚配置、没有其他硬件配置
//! 要求。 不使用中断。
//!
//! 发送数据流、然后与接收到的数据流进行比较。
//! 发送的数据如下所示:\n
//! 0000 0001 0002 0003 0004 0005 0006 0007… FFFE FFFF \n
//! 这种模式会一直重复。
//!
//! b 监视\b 变量\n
//! -\b sdata -已发送数据
//! -\b RDATA -接收到的数据
//!
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################

//
//包含的文件
//
#include "F28x_Project.h"

//
//函数原型
//
void delay_loop (void);
void SPI_xmit (uint16 a);
void SPI_Fifo_init (void);
void SPI_init (void);
void 错误(void);

void main (void)

uint16 sdata;//发送数据
uint16 RDATA;//接收的数据

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//仅为 SPI-A 功能设置 GP I/O
//此函数位于 F2837xD_SPI.c 中
//
InitSpiaGpio();

//
//步骤3. 清除所有中断:
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE __interrupts 和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是__interrupt
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();

//
//步骤4. 初始化器件外设:
//
SPI_Fifo_init();//初始化 SPI FIFO

//
//步骤5. 用户特定代码:
//
sdata = 0x0000;
for (;;)

//
//发送数据
//
SPI_xmit (sdata);

//
//等待数据被接收
//
while (SpibRegs.SPIFFRX.bit.RXFFST!=1){}

//
//检查已发送的数据
//
RDATA = SpibRegs.SPIRXBUF;
if (RDATA!= sdata)

error();

sdata++;

//
// delay_loop -短暂延迟的循环
//
void delay_loop ()

长 I;
对于(i = 0;i < 1000000;i++){}

//
//错误-停止调试器的错误函数
//
空错误(空)

asm (" ESTOP0");//测试失败!! 停下来!
适用于(;);

//
// SPI_xmit -通过 SPI 发送值
//
void SPI_xmit (uint16 A)

SpibRegs.SPITXBUF = A;

//
// SPI_Fifo_init -初始化 SPIA FIFO
//
void SPI_Fifo_init()

//
//初始化 SPI FIFO 寄存器
//
SpibRegs.SPIFFTX.ALL = 0xE040;
SpibRegs.SPIFFRX.ALL = 0x2044;
SpibRegs.SPIFFCT.ALL = 0x0;

//
//初始化内核 SPI 寄存器
//
InitSpi();

  

//######################################################################################################################
//
//文件:F2837xD_SPI.c
//
//标题:F2837xD SPI 初始化和支持函数。
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################

//
//包含的文件
//
#include "F2837xD_DEVICE.h"
#include "F2837xD_examples.h"

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

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

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

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

//初始化 SPI-A

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

//启用主设备(0 =从设备,1 =主设备)
//启用传输(TALK)
//时钟相位(0 =正常、1 =延迟)
//禁用 SPI 中断
SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpibRegs.SPICTL.bit.TALK = 1;
SpibRegs.SPICTL.bit.CLK_PHASE = 0;
SpibRegs.SPICTL.bit.SPIINTENA=0;
//设置波特率
SpibRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;

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

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

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

InitSpiaGpio();

//
// InitSpiaGpio -初始化 SPIA GPIO
//
空 InitSpiaGpio()

EALLOW;

//
//为所选引脚启用内部上拉
//
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;//启用 GPIO16上的上拉电阻器(SPISIMOA)
// GpioCtrlRegs.GPAPUD.bit.GPIO5=0;//启用 GPIO5上的上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉电阻器(SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;//启用 GPIO19上的上拉电阻器(SPISTEA)

//
//仅将所选引脚的限定条件设置为异步
//
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3;//异步输入 GPIO16 (SPISIMOA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3;//异步输入 GPIO5 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;//异步输入 GPIO17 (SPISOMIA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3;//异步输入 GPIO3 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;//异步输入 GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;//异步输入 GPIO19 (SPISTEA)

//
//使用 GPIO 寄存器配置 SPI-A 引脚
//
//这指定哪些可能的 GPIO 引脚将是 SPI 功能
//引脚。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 6;//将 GPIO16配置为 SPISIMOA
// GpioCtrlRegs.GPAMUX1.bit.GPIO5=2;//将 GPIO5配置为 SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO25=6;//将 GPIO17配置为 SPISOMIA
// GpioCtrlRegs.GPAMUX1.bit.GPIO3=2;//将 GPIO3配置为 SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 6;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 6;//将 GPIO19配置为 SPISTEA

EDIS;

//
//文件结束
//

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

    我修复了。  我在数据表中误解了多路复用器配置。  在我进行下面的更改后、它工作正常。

    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2;//将 GPIO16配置为 SPISIMOA
    GpioCtrlRegs.GPAGMUX2.bit.GPIO24=1;//将 GPIO16配置为 SPISIMOA

    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2;//将 GPIO16配置为 SPISIMOA
    GpioCtrlRegs.GPAGMUX2.bit.GPIO25=1;//将 GPIO16配置为 SPISIMOA

    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2;//将 GPIO16配置为 SPISIMOA
    GpioCtrlRegs.GPAGMUX2.bit.GPIO26=1;//将 GPIO16配置为 SPISIMOA

    GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 2;//将 GPIO16配置为 SPISIMOA
    GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 1;//将 GPIO16配置为 SPISIMOA

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

    您好、BTC、

    很高兴听到您找到了一个解决方案。 关闭帖子。

    最棒的

    Kevin