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.
您好!
我正在尝试将我的 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。
Manoj、
您能告诉我 F28379D 可以提供的最大电流是多少?
BR、
Dawid。
现在、我看到的是、您是指来自 I/O 的源 如果这是原因、那么外部上拉电阻器应该解决这个问题吗?
BR、
Dawid。
Manoj、
我认为所有 W5100都采用180mA 电流、而不仅仅是 MOSI 线路。 您的意思是 W5100仅仅通过一条 MOSI 线路就能吸收170mA 的电流吗?
BR、
Dawid。