嗨,对话小组,
我很难让SPI在从属模式下工作。我想用DA14580作为SPI的奴隶。我将我的DevKit Pro连接到SPI主机。SPI主机连续发出“0xAA”,SPI频率为500kHz。在DA14580上,我创建了一个简单的项目,它在主循环中轮询SPI\u INT\u位,然后读取SPI数据并打印出来。参见下面的代码。
我的问题是,我的错误率约为2%。我怀疑这是某种时间问题,因为我读取的错误数据通常是0x55。
我已经在下面粘贴了我的代码(主循环和init函数)。你知道是什么导致了这个问题吗?我的初始化有问题,或者我访问SPI的方式不对?
谢谢你的帮助!
SPI初始化:
静态void user\u spi\u init()
{
//从属配置
//设置时钟
SetBits16(CLK_PER_REG,SPI_DIV,0x3);//设置SPI内部时钟分频器
SetBits16(CLK_PER_REG,SPI_ENABLE,1);//为SPI启用时钟
//初始化SPI模块(SPI\ U CTRL\ U 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);//禁用对CPU的SPI可屏蔽中断
SetBits16(SPI_CTRL_REG,SPI_EN_CTRL,0x1);//从模式的SPI EN pin(芯片选择)
//(SPI\ U CTRL\ U REG1)
SetBits16(SPI_CTRL_REG1,SPI_FIFO_MODE,0x03);//禁用SPI RX和TX FIFO
SetBits16(SPI_CTRL_REG1,SPI_PRIORITY,0x00);//SPI DMA PRIORITY
SetBits16(SPI_CTRL_REG,SPI_ON,1);//启用SPI模块
NVIC\u DisableIRQ(SPI\u IRQn);
}
主回路:
而(1)
{
while(spi\u data\u rdy\u getf())//@返回spi\u INT\u位值:如果有可用的接收数据,则为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\u打印
printf_字符串(“\n\r接收数据:\n\r”);
打印字(读取字节);
#结束
}
}
编辑:更改的问题描述
嗨,马勃伦,
试着降低你的SPI主机的时钟,你的从机上的内部SPI时钟应该是你的主机上的4倍大。还要确保这两个设备有共同的gnd和您的SPI连接应尽可能短。另外,我建议使用驱动程序初始化SPI模块。
谢谢你的对话
嗨,MT\u dialog,
谢谢,共同点才是问题所在!现在接收数据的工作完美无瑕。:)
不幸的是,从从属服务器发送数据仍然会带来问题。当我在SPI\u CTRL\u REG中设置SPI\u EN\u CTRL位时,连接不可靠(大约50%的错误率)。我试着把SPI频率降低到32kHz,但没有任何效果。当我清除SPI\u EN\u CTRL位时,错误率为0%。在示波器上,芯片选择信号看起来很好(在整个传输期间为“低”)。
你知道这是什么原因吗?停用SPI\u EN\u CTRL有什么后果?
谢谢,
马勃朗
嗨,马勃伦,
请查一下你的其他帖子
http://support.dialog.com/external proximity reporter应用程序-。。。
谢谢你的对话