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.

[参考译文] LAUNCHXL-F28379D:奇怪的 MOSI 行为。 它不会返回 Vcc。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/689365/launchxl-f28379d-strange-mosi-behaviour-it-doesn-t-return-to-vcc

器件型号:LAUNCHXL-F28379D

您好!

我正在尝试将我的 launchpad 与 Wiznet W5100芯片进行通信、我注意到了一些奇怪的事情。 在我的应用中、我尝试每秒读取一个字节。 为了读取它、我必须发送运算代码寄存器和虚拟数据以将我的数据推入读取。

它与 MOSI 行为有关。 它不会在每次传输时恢复到高电平、我认为这是我读取的数据并非总是正确的原因。 以下是我的示波器图片:

500ms/div:

使用50us/div:

您可以看到数据已发送、但我不知道 MOSI 为何在传输后不会返回空闲状态。 以下是我初始化 SPI 的代码(来自用于 c28xx 的 TI EtherCAT hal)和用于发送数据的代码:

#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"
#include "PinMux/pinmux.h"

#if CPU_FRQ_200MHz
#define SPI_BRR ((200E6 / 4)/ 500E3)- 1
#endif

//
函数原型
//
void InitSpiAGpioPullUps (void);
void ESC_initSPIFO (void);
void ESC_writeSPI (void);

uint16_t readval[8];
volatile Spi_regs * Spixs (

void)*= 1 / void (void)。




初始化系统控制:
// PLL、看门狗、启用外设时钟
//此示例函数位于 F2837xD_sysctrl.c 文件中。
//
InitSysCtrl();

//
步骤2。 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件中,
//说明了如何将 GPIO 设置为其默认状态。
//仅为 SPI-A 功能设置 GP I/O
//此函数可在 F2837xD_SPI.c
中找到//
GPIO_setPinMuxConfig ();
InitSpiAGpioPullUps ();
//
步骤3。 清除所有中断:
//
DINT;

//
初始化 PIE 控制寄存器到其默认状态。
//默认状态是禁用所有 PIE _interrupts 并
清除标志//。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();

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

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

//
//步骤4。 初始化设备外设:
//
ESC_initSPIFO ();

//
//步骤5。 用户特定代码:
//

SpixRegs->SPITXBUF =(0xF000);//重置 W5100
SpixRegs->SPITXBUF =(0x0080);
while (SpixRegs->SPIFFRX.bit.RXFFST < 2);
readval[0]= SpixRegs->SPIREXBUF =(


1)

;{advxRXBUF = 1;[pixRegs->SPIFR4]=SPIWR16];[bul_4;[bacuF = 1;[pixeIWR16]=SPIruF = 1;[bul_0]=SPIr0]=SPIr0
ESC_writeSPI ();//读取采样寄存器

DELAY_US (1000*1000);
}


空 InitSpiAGpioPullUps (空)
{
EALLOW;
//在 SPISIMO/SPISOMI/SPICLK/SPISTE 引脚上启用上拉
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO59=0;
GpioCtrlRegs.GPBPUD.bit.GPIO60=0;
GpioCtrlRegs.GPBPUD.bit.GPIO61=0;

//将 SPISIMO/SPISOMI/SPICLK 引脚启用为异步
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 0b11;
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 0b11;
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 0b11;
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 0b11;
EDIS;
}
void ESC_initSPIFO (void)
{
uint16_t m;
EALLOW;

// FIFO 配置
SpixRegs->SPIFFCT.all=0x0; //将 SPI 置于复位状态
for (m=0;m<3;m++);
SpixRegs->SPIFFRX.All=0x2040; //启用 RX FIFO,清除 FIFO 内部
SpixRegs->SPIFFRX.bit.RXFFIL = 16; //设置 RX FIFO 深度
SpixRegs->SPIFFTX.All=0xE040; //启用 FIFO、释放 TX FIFO、

// SPI 配置
SpixRegs->SPIFFTX.bit.TXFFIL = 16; //设置 TX FIFO 级别
SpixRegs->SPICCR.bit.SPICHAR = 16-1; //字符长度= 8
SpixRegs->SPICCR.bit.CLKPOLARITY = 0;//上升沿
SpixRegs->SPICTL.bit.SPIINTENA=1; //已启用
SpixRegs->SPICTL.bit.TALK = 1; //
SpixRegs->SPICTL.bit.master_slave = 1;//主模式
SpixRegs->SPICTL.bit.CLK_PHASE = 1; //添加 Clk wrt SPISTEA 的1/2周期延迟
SpixRegs->SPICTL.bit.OVERRUNINTENA=1;//溢出中断被启用
SpixRegs->SPISTS.All=0x0000; //清除状态位(TxBufFull、INT、溢出)

SpixRegs->SPIBRR.all = 0x63; // LSPCLK/100
//ClkCfgRegs.LOSPP.ALL = 0x1; // 0 = SYSCLK/1 = 200M;1 = SYSCLK/2 = 100M
//SpixRegs->SPIBRR.All=0x001; //波特率= LSPCLK /(SPIBRR+1)[LSPCLK=SYSCLK/4、默认情况下=50m]
SpixRegs->SPIFFCT.all=0x00;
SpixRegs->SPIPRI.All=0x0020; //在 EMUStop 上完成事务后停止

SpixRegs->SPIFFTX.bit.TXFFIENA=0; //禁用 TXFF INT
SpixRegs->SPIFFRX.bit.RXFFIENA=0; //禁用 RXFF INT


SpixRegs->SPICCR.bit.SPISWRESET=1; //启用 SPI

EDIS;
}

void ESC_writeSPI (void)
{
SpixRegs->SPITXBUF =(0x0F00);
SpixRegs->SPITXBUF =(0x1A00);
while (SpixRegs->SPIFFRX.bit.RXFFST < 2);
readval[2]= SpixRegs->SPIRXBUF;
readval[3]= SpixRegs->SPIRXBUF;

SpixRegs->SPIFFTX.bit.TXFIFO=0; //重置 Tx FIFO
SpixRegs->SPIFFRX.bit.RXFIFORESET = 0;//复位 FIFO 指针
DELAY_US (2);
SpixRegs->SPIFFTX.bit.TXFIFO=1; //重置 Tx FIFO
SpixRegs->SPIFFRX.bit.RXFIFORESET = 1;//重新启用 FIFO 操作
}

我认为这不是 MOSI 的常规行为。 我感谢你的任何帮助。

此致、
Dawid。

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

    看起来像是硬件问题。 您是否检查了连接。 检查 W5100灌电流是否大于 F28379D 可提供的电流。

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

    Manoj、

    您能告诉我 F28379D 可以提供的最大电流是多少?

    BR、
    Dawid。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我的 W5100屏蔽被断开时、我检查了 MOSI、然后 MOSI 看起来是正确的。 我还检查了 W5100屏蔽的外部电源、MOSI 行为与第一篇文章中的图片相同。 W5100灌电流大约为180mA。 它看起来就像您说的、是硬件问题。 您是否知道我接下来应该检查什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dawid、

    F28379D I/O 引脚支持的最大电流为4mA。 这可以在 Pg57、5.6电气特性中找到。

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

    现在、我看到的是、您是指来自 I/O 的源 如果这是原因、那么外部上拉电阻器应该解决这个问题吗?

    BR、

    Dawid。

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

    我不认为使用上拉电阻器会起作用。 F28379 I/O 可灌入(或)拉取4mA 电流。 W5100似乎吸收了180mA 的电流。
    当 MOSI 被拉至低电平时、F28379D 需要灌入~μ A 左右的电流。 这种大电流会损坏 I/O 您可能需要考虑添加一个可支持 W5100所需灌电流/拉电流的双向缓冲器。

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

    Manoj、

    我认为所有 W5100都采用180mA 电流、而不仅仅是 MOSI 线路。 您的意思是 W5100仅仅通过一条 MOSI 线路就能吸收170mA 的电流吗?

    BR、
    Dawid。

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

    我没有查看 W5100数据表。所以、我只是根据您发布的内容进行了自述。

    此致、
    曼诺伊