嗨对话框,
我正在使用您的SPI驱动程序并将其配置为从模式。RX端似乎很好,但对于TX侧,我总是得到两个字节的垃圾数据(始终是先前包的最后两个字节)。
例如
我想发送01 02 03 04 05的第一个包和主侧接收的数据是00 00 00 01 02 03;我再次发送包裹,而且此时,由Master接收的数据是04 05 01 02 03。
源代码下面粘贴:
void ld_spi_init()
{
// ARCH_PRINTF(“SPI INIT函数调用\ n”);
spi_word_mode_t bit_mode = spi_mode_8bit;
spi_role_t角色= spi_role_slave;
spi_polarity_mode_t clk_pol = spi_clk_idle_pol_low;
spi_pha_mode_t pha_mode = spi_pha_mode_1;
spi_mint_mode_t irq = spi_mint_enable;
spi_xtal_freq_t freq = spi_xtal_div_2;
spi_init(&cs_pad,bit_mode,角色,clk_pol,pha_mode,Irq,freq);
// setword16(spi_ctrl_reg1,(getword16(spi_ctrl_reg1)| 0x0003));
nvic_clearpendingirq(spi_irqn);
nvic_setpriority(spi_irqn,0);
nvic_enableirq(spi_irqn);
返回;
}
// 4M比特率/ 500K字节看起来安全
void spi_handler(void)
{
uint16_t a,b;
count ++;
B =计数;
// ARCH_PRINTF(“B =%04x \ t”,b);
// setword16(spi_clear_int_reg,1);
if(spi_flag == 0)
{
c = 0x01;
spi_flag = 1;
setword16(gpio_irq0_in_sel_reg,2);
setword16(gpio_int_level_ctrl_reg,0x0000);
gpio_registercallback(gpio0_irqn,gpio0_irq_handler);
nvic_clearpendingirq(gpio0_irqn);
nvic_setpriority(gpio0_irqn,1);
nvic_enableirq(gpio0_irqn);
}
其他
{
C ++;
}
a = spi_access(count);
// ARCH_PRINTF(“rx:%04x \ t”,a);
返回;
}
void gpio0_irq_handler(void)
{
if(spi_flag == 1)
{
spi_flag = 0;
count = 0;
setword16(gpio_irq0_in_sel_reg,0);
nvic_clearpendingirq(gpio0_irqn);
nvic_disableirq(gpio0_irqn);
ARCH_PRINTF(“SPI发送完成,C =%D \ n”,c);
}
setword16(gpio_reset_irq_reg,1);
}
你能帮我帮助我吗?
非常感谢!
zwang308,
我认为问题是由于在FIFO中没有数据上没有数据访问SPI从站时,这导致读取两个零点,那么其他3个字节正在进行您的FIFO,您就可以读取它们。您必须确保在阅读之前FIFO中有数据。
谢谢mt_dialog.
嗨mt_dialog,
根据DA14580的数据表Page100,表149,SPI_CTRL_REG1,SPI_FIFO_MODE的默认值为0x03,我认为这意味着没有使用FIFO。
在您的驱动程序SPI_INIT函数中,我认为它会更改SPI_FIFO_MODE值。所以,我想在我的申请中,SPI控制器不使用FIFO。
你能帮我验证这些信息吗?
谢谢
zwang308,
是的,这是对的。在驾驶员中,没有使用FIFO,并且寄存器的复位值是0x03。但是由于您通过两个字节的移动数据被移位数据,我猜您在没有数据时读取数据寄存器。也许你应该检查另一个MCU的接收代码。您从DA发送并移位的数据,您是否将它们打印到来自硕士侧的终端?你还可以用逻辑分析仪查看公共汽车吗?您的主使用的SPI时钟也是什么?由于您在DA中使用的8MHz SPI时钟尝试使用2MHz作为主时钟。
谢谢mt_dialog.
嗨mt_dialog,
我使用全阶段的AARDVark模拟器作为SPI Master,我使用USBee Rx作为逻辑分析器来检查总线上的数据。Master的所有TX数据都是正确的,并且来自DA的TX数据由两个字节移位。所以,我怀疑问题是在DA的固件方面。
谢谢,
我们有什么更新吗?谢谢
zwang308,
我用了两个da作为主掌握而作为奴隶,我设法从从站获取所有数据到master,没有移动字节。如果将从某些东西置于FIFO中的时钟,则当SPI_Access函数被称为从站将到TRASMIT零,然后将您想要的值加载到发送寄存器中,因此下一个值应该是您加载到的数字以前的ISR电话。您是否尝试过掌握师父的时钟并增加DA(奴隶)的时钟?还可以尝试直接访问寄存器spi_rx_tx_reg0请清除spi中断标志吗?
谢谢mt_dialog.
嗨mt_dialog,
非常感谢信息。我想我想要我需要。
谢谢!