SPI驱动程序从动模式。

8个帖子/ 0新
最后一篇
Zwang308.
离线
最后一次露面:4年5个月前
掌握
加入:2014-07-02 14:15
SPI驱动程序从动模式。

嗨对话框,

我正在使用您的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);
}

你能帮我帮助我吗?

非常感谢!

关键词:
设备:
mt_dialog.
离线
最后一次露面:3个月4天前
职员
加入:2015-06-08 11:34
zwang308,

zwang308,

我认为问题是由于在FIFO中没有数据上没有数据访问SPI从站时,这导致读取两个零点,那么其他3个字节正在进行您的FIFO,您就可以读取它们。您必须确保在阅读之前FIFO中有数据。

谢谢mt_dialog.

Zwang308.
离线
最后一次露面:4年5个月前
掌握
加入:2014-07-02 14:15
嗨mt_dialog,

嗨mt_dialog,

根据DA14580的数据表Page100,表149,SPI_CTRL_REG1,SPI_FIFO_MODE的默认值为0x03,我认为这意味着没有使用FIFO。

在您的驱动程序SPI_INIT函数中,我认为它会更改SPI_FIFO_MODE值。所以,我想在我的申请中,SPI控制器不使用FIFO。

你能帮我验证这些信息吗?

谢谢

mt_dialog.
离线
最后一次露面:3个月4天前
职员
加入:2015-06-08 11:34
zwang308,

zwang308,

恩,那就对了。在驾驶员中,没有使用FIFO,并且寄存器的复位值是0x03。但是由于您通过两个字节的移动数据被移位数据,我猜您在没有数据时读取数据寄存器。也许你应该检查另一个MCU的接收代码。您从DA发送并移位的数据,您是否将它们打印到来自硕士侧的终端?你还可以用逻辑分析仪查看公共汽车吗?您的主使用的SPI时钟也是什么?由于您在DA中使用的8MHz SPI时钟尝试使用2MHz作为主时钟。

谢谢mt_dialog.

Zwang308.
离线
最后一次露面:4年5个月前
掌握
加入:2014-07-02 14:15
嗨mt_dialog,

嗨mt_dialog,

我使用全阶段的AARDVark模拟器作为SPI Master,我使用USBee Rx作为逻辑分析器来检查总线上的数据。Master的所有TX数据都是正确的,并且来自DA的TX数据由两个字节移位。所以,我怀疑问题是在DA的固件方面。

谢谢,

Zwang308.
离线
最后一次露面:4年5个月前
掌握
加入:2014-07-02 14:15
我们有什么更新吗?谢谢

我们有什么更新吗?谢谢

mt_dialog.
离线
最后一次露面:3个月4天前
职员
加入:2015-06-08 11:34
zwang308,

zwang308,

我用了两个da作为主掌握而作为奴隶,我设法从从站获取所有数据到master,没有移动字节。如果将从某些东西置于FIFO中的时钟,则当SPI_Access函数被称为从站将到TRASMIT零,然后将您想要的值加载到发送寄存器中,因此下一个值应该是您加载到的数字以前的ISR电话。您是否尝试过掌握师父的时钟并增加DA(奴隶)的时钟?还可以尝试直接访问寄存器spi_rx_tx_reg0请清除spi中断标志吗?

谢谢mt_dialog.

Zwang308.
离线
最后一次露面:4年5个月前
掌握
加入:2014-07-02 14:15
嗨mt_dialog,

嗨mt_dialog,

非常感谢信息。我想我想要我需要。

谢谢!

主题锁定