嗨对话小组,
我很难在从事模式工作中获得SPI。我想使用da14580 als一个spi奴隶。我将我的devkit pro连接到spi master。SPI主机连续发送“0xAA”,SPI频率为500kHz。在DA14580上,我创建了一个简单的项目,调查主循环中的SPI_Int_Bit,然后读取SPI数据并将其打印出来。请参见下面的代码。
我的问题是我的错误率约为。2%。我怀疑它是某种时序问题,导致错误的数据我正在阅读通常为0x55。
我已经粘贴了下面的代码(主循环和init函数)。有什么想法可能导致问题?我的初始化有问题,或者我以错误的方式访问SPI吗?
谢谢你的帮助!
SPI初始化:
静态void user_spi_init()
{
// Slave Config.
//设置时钟
setbits16(clk_per_reg,spi_div,0x3);//设置SPI内部时钟分频器
setbits16(clk_per_reg,spi_enable,1);//为spi启用时钟
//初始化SPI模块(SPI_CTRL_REG)
setBits16(SPI_CTRL_REG,SPI_ON,0);//关闭SPI模块,如果打开
setbits16(spi_ctrl_reg,spi_word,0x00);//设置为8位模式
setbits16(spi_ctrl_reg,spi_smn,0x1);//在从动模式下设置SPI
setBits16(SPI_CTRL_REG,SPI_POL,0x0);//模式3:SPI_POL = 0
setbits16(spi_ctrl_reg,spi_pha,0x1);//和spi_pha = 1
setBits16(SPI_CTRL_REG,SPI_MINT,0x0);//禁用SPI可屏蔽中断到CPU
setbits16(spi_ctrl_reg,spi_en_ctrl,0x1);//从模式(芯片选择)的SPI en引脚
//(spi_ctrl_reg1)
setbits16(spi_ctrl_reg1,spi_fifo_mode,0x03);//禁用SPI RX和TX FIFO
setbits16(spi_ctrl_reg1,spi_priority,0x00);// SPI DMA优先权
setbits16(spi_ctrl_reg,spi_on,1);//启用SPI模块
nvic_disableirq(spi_irqn);
}
主循环:
而(1)
{
while(spi_data_rdy_getf())// @return spi_int_bit值:1如果有可用的数据,则为0。
{
//在FIFO中读取收到的字节
bytes_read = getword16(spi_rx_tx_reg0);//从spi读取字节
setword16(spi_clear_int_reg,0x01);//清除待定标志
setword16(spi_rx_tx_reg0,0x00aa);//将数据写入TX寄存器
#ifdef cfg_printf.
printf_string(“\ n \ rreceived数据:\ n \ r”);
print_word(bytes_read);
#Endif.
}
}
编辑:更改了问题描述
嗨mabraun,
尝试将时钟降低到您的SPI主人中,从奴隶上的内部SPI时钟应该比你的主人身上更大的4倍。还要确保这两个设备具有共同的GND,您的SPI连接应尽可能短。此外,我建议使用驱动程序进行SPI模块的初始化。
谢谢mt_dialog.
嗨mt_dialog,
谢谢,共同点是问题!接收数据现在完美无瑕。:)
不幸的是,从奴隶发送数据仍然存在问题。当我在spi_ctrl_reg中设置spi_en_ctrl位时,连接不可靠(〜50%的错误率)。我试图将SPI频率降低到32kHz,没有任何区别。当我清除SPI_EN_CTRL位时,我有0%的错误率。在范围内,芯片选择信号看起来很好(在整个传输期间'低')。
任何可能导致这件事的想法吗?停用spi_en_ctrl的后果是什么?
谢谢,
Mabraun.
嗨mabraun,
请检查您的其他帖子
http://support.dialog-semicondiondiondum/external-proximity-reporter-app -...
谢谢mt_dialog.