嗨,对话框的团队,
我有困难使SPI在从属模式工作。我想使用DA14580的SPI奴隶。我将我的DevKit Pro连接到一个SPI master。SPI主机连续发出“0xAA”,SPI频率为500kHz。在DA14580上,我创建了一个简单的项目,它在主循环中轮询SPI_INT_BIT,然后读取SPI数据并打印出来。请参见下面的代码。
我的问题是我有一个大约的错误率。2%。我怀疑这是某种时间问题,因为我读取的错误数据通常是0x55。
我已经将我的代码(主循环和初始化函数)粘贴在下面。你知道是什么导致了这个问题吗?我的初始化有问题,或者我以错误的方式访问SPI ?
谢谢你的帮助!
SPI初始化:
静态孔隙user_spi_init ()
{
/ /从配置
/ /设置时钟
SetBits16 (CLK_PER_REG SPI_DIV 0 x3);//设置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 0 x00);//设置为8位模式
SetBits16 (SPI_CTRL_REG SPI_SMN 0 x1);//设置从模式的SPI
SetBits16 (SPI_CTRL_REG SPI_POL 0 x0);//模式3:SPI_POL = 0
SetBits16 (SPI_CTRL_REG SPI_PHA 0 x1);//和sp_pha = 1
SetBits16 (SPI_CTRL_REG SPI_MINT 0 x0);//禁用SPI屏蔽中断到CPU
SetBits16 (SPI_CTRL_REG SPI_EN_CTRL 0 x1);// SPI EN引脚从模式(芯片选择)
/ / (SPI_CTRL_REG1)
SetBits16 (SPI_CTRL_REG1 SPI_FIFO_MODE 0 x03);//禁用SPI RX和TX fifo
SetBits16 (SPI_CTRL_REG1 SPI_PRIORITY 0 x00);// SPI DMA优先级
SetBits16 (SPI_CTRL_REG SPI_ON 1);//启用SPI模块
NVIC_DisableIRQ (SPI_IRQn);
}
主循环:
而(1)
{
while (spi_data_rdy_getf()) // @返回SPI_INT_BIT值:如果接收到数据可用,则为1,否则为0。
{
//读取FIFO中接收的字节
bytes_read = GetWord16 (SPI_RX_TX_REG0);//从SPI读取字节
SetWord16 (SPI_CLEAR_INT_REG 0 x01);//清除挂起标志
SetWord16 (SPI_RX_TX_REG0 0 x00aa);//将数据写入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,
谢谢,共同点才是问题所在!现在数据接收工作完美无缺。:)
不幸的是,从slave发送数据仍然会带来问题。当我在SPI_CTRL_REG中设置SPI_EN_CTRL位时,连接是不可靠的(~50%的错误率)。我尝试将SPI频率减少到32kHz,没有任何区别。当我清除SPI_EN_CTRL位时,我有0%的错误率。在示波器上,芯片选择信号看起来很好(在整个传输期间“低”)。
你知道是什么引起的吗?停用SPI_EN_CTRL的后果是什么?
谢谢,
mabraun
嗨mabraun,
请检查你的其他帖子
http://support.dialog-semiconductor.com/external-proximity-reporter-app-..。
由于MT_dialog