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.
尊敬的所有人:
你好
我尝试 在 F28379D 和 Arduino 之间进行 SPI 通信。
F28379D (从属) Arduino (主控/SPI_Cock=1M Hz)
我发现进入 INTERRUPT_ISR (f28379d)的次数超过 Arduino 发送的数据数。
我使用 interrupt_ISR 中的系统配置时钟和计数器来计算数字。
通过"暂停"按钮、我可以得到计数器的数量以及该时间内的时钟数量。
[ 计数器数量 / ( 时钟数量*9*10^(-9) ) =一秒内计数器数量]
我认为问题是我的螺旋状。
void main(void) { // // Step 1. Initialize System Control: // InitSysCtrl(); // // Step 2. Initialize GPIO: // SpicInitGpio(); // // Step 3. Initialize PIE vector table: // Disable and clear all CPU interrupts // DINT; IER = 0x0000; IFR = 0x0000; // // Initialize PIE control registers to their default state: // InitPieCtrl(); // // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // InitPieVectTable(); // // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. // EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.SPIC_RX_INT = &spicRxFIFOISR; EDIS; // This is needed to disable write to EALLOW protected registers // // Step 4. Initialize the Device Peripherals: // spi_fifo_init(); // Initialize the SPI only // // Step 5. User specific code, enable interrupts: // // // Enable interrupts required for this example // PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block PieCtrlRegs.PIEIER6.bit.INTx9 = 1; // Enable PIE Group 6, INT 9 IER=0x20; // Enable CPU INT6 EINT; // Enable Global Interrupts // // Step 6. IDLE loop. Just sit and loop forever (optional): // for(;;); } // // spi_fifo_init - Initialize SPI FIFO // void spi_fifo_init() { // // Initialize SPI FIFO registers // SpicRegs.SPIFFTX.all = 0xE082; // Enable FIFOs, set TX FIFO level to 2 SpicRegs.SPIFFRX.all = 0x24A2; // Set RX FIFO level to 2 SpicRegs.SPIFFCT.all = 0x0000; // // Initialize core SPI registers // SpiInit(); } // // spiRxFifoIsr - ISR for SPI receive FIFO // interrupt void spicRxFIFOISR(void) { counter++; rdata=(SpicRegs.SPIDAT); // Read data rdata=rdata%256; rdata=(rdata<<4); SpicRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag SpicRegs.SPIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag PieCtrlRegs.PIEACK.all = PIEACK_GROUP6; } void SpicInitGpio() { EALLOW; // // Enable internal pull-up for the selected pins // // Pull-ups can be enabled or disabled by the user. // This will enable the pullups for the specified pins. // Comment out other unwanted lines. // GpioCtrlRegs.GPDPUD.bit.GPIO122 = 0; // Enable pull-up on GPIO122 (SPISIMOC) GpioCtrlRegs.GPDPUD.bit.GPIO123 = 0; // Enable pull-up on GPIO123 (SPISOMIC) GpioCtrlRegs.GPDPUD.bit.GPIO124 = 0; // Enable pull-up on GPIO124 (SPICLKC) GpioCtrlRegs.GPDPUD.bit.GPIO125 = 0; // Enable pull-up on GPIO125 (SPISTEC) GpioCtrlRegs.GPDQSEL2.bit.GPIO122 = 3; // Asynch input GPIO122 (SPISIMOC) GpioCtrlRegs.GPDQSEL2.bit.GPIO123 = 3; // Asynch input GPIO123 (SPISOMIC) GpioCtrlRegs.GPDQSEL2.bit.GPIO124 = 3; // Asynch input GPIO124 (SPICLKC) GpioCtrlRegs.GPDQSEL2.bit.GPIO125 = 3; // Asynch input GPIO125 (SPISTEC) GpioCtrlRegs.GPDMUX2.bit.GPIO122 = 2; // Configure GPIO122 as SPISIMOC GpioCtrlRegs.GPDMUX2.bit.GPIO123 = 2; // Configure GPIO123 as SPISOMIC GpioCtrlRegs.GPDMUX2.bit.GPIO124 = 2; // Configure GPIO124 as SPICLKC GpioCtrlRegs.GPDMUX2.bit.GPIO125 = 2; // Configure GPIO125 as SPISTEC GpioCtrlRegs.GPDGMUX2.bit.GPIO122 = 1; // Configure GPIO122 as SPISIMOC GpioCtrlRegs.GPDGMUX2.bit.GPIO123 = 1; // Configure GPIO123 as SPISOMIC GpioCtrlRegs.GPDGMUX2.bit.GPIO124 = 1; // Configure GPIO124 as SPICLKC GpioCtrlRegs.GPDGMUX2.bit.GPIO125 = 1; // Configure GPIO125 as SPISTEC EDIS; } void SpiInit(void) { // Set the baud rate SpicRegs.SPIBRR.bit.SPI_BIT_RATE = 0x0001; // Halting on a breakpoint will not halt the SPI SpicRegs.SPIPRI.bit.FREE = 1; //When changing configuration, you should clear this bit before the changes and set this bit before resuming operation. SpicRegs.SPICCR.bit.SPISWRESET = 1; //(Shift Clock Polarity) This bit controls the polarity of the SPICLK signal. CLOCK POLARITY and POLARITY CLOCK PHASE (SPICTL.3) control four clocking schemes on the SPICLK pin. SpicRegs.SPICCR.bit.CLKPOLARITY = 0; //(Character Length Control Bits)the number of bits to be shifted in or SPI CHAR0 out as a single character during one shift sequence. SpicRegs.SPICCR.bit.SPICHAR = 7;//( 8-bit f bits to be shifted in or SPI CHAR0) //SPI is configured as a slave SpicRegs.SPICTL.bit.MASTER_SLAVE = 0; //Enables transmission SpicRegs.SPICTL.bit.TALK =0; //SPI Clock Phase Select SpicRegs.SPICTL.bit.CLK_PHASE = 0; } // // End of file //
我应该更改此代码部分的哪一部分?
或者 我的计算错误?
如果您能帮我解决问题、我将不胜感激。
此致、
Jessie
Jessie、您好!
您是否曾尝试使用示波器验证从 Arduino 输出的数据? 在 F28379D 上接收到的数据是否存在问题?
通常情况下、数据不会从 SPIDAT 中读取、因为这是发送和接收移位寄存器、数据应从 SPIRXBUF 寄存器中读取。
TX FIFO 中的每个 FIFO 都启用了2级 FIFO、这意味着只有当 RXFFST 大于或等于 RXFFIL (设为2个字)时、RX ISR 才会执行。 这正是您所期望的吗?
此致、
Marlyn
Jessie、您好!
如果您没有写入发送缓冲区、则不会产生发送中断、因为 FIFO 的条件将不会满足。 您还将 TXFFIENA 位设置为0、以禁用 TX 中断、因此我认为这不会影响您看到的内容。
正如我之前所说的、您是否尝试使用示波器来验证从 Arduino 输出的数据? 在 F28379D 上接收到的数据是否存在问题?
此致、
Marlyn