我们使用Pan1740作为SPI从站(SPI_SMN = 1)以及STM32作为主机。我们目前连接/ CS,CLK,MISO和MOSI和GND(没有进一步的握手线)。主设备用125 kHz驱动SPI时钟,确保常见的GND,O-Scope显示出良好的终止线信号。我们在DA14580中启用了SPI中断(SPI_MINT = 1)模式,并在无-FFO模式下接收/发送(SPI_FIFO_MODE = 0x03)现在工作。但是要使它工作,我们需要一个奇怪的SPI配置为DA14580从模式,所以我们假设我们仍然具有配置问题:
1)SPI奴隶需要SPI_CLK作为输出?
首先,我们将GPIO配置为SPI_CLK(端口/引脚P 0 _ 0),以输入多个演示代码和HCI演示:
- gpio_configurepin(spi_clk_gpio_port,spi_clk_gpio_pin,input_pullup,pid_spi_clk,false);
但这导致缺失的SPI中断,受扰动/传输的字节和受干扰的MISO线路用法(不是CLK对齐的味噌转变)。一旦我们将SPI_CLK引脚更改为输出(适用于奴隶!?)它运行良好:
- gpio_configurepin(spi_clk_gpio_port,spi_clk_gpio_pin,输出,pid_spi_clk,false);
2)SPI奴隶应该忽略主CS(SPI_EN)?
我们启用了DA14580 SPI从站使用,如演示代码和HCI演示中所述,用于使用主驱动CS:
- setbits16(spi_ctrl_reg,spi_en_ctrl,1);
但与上述条件一起,它不起作用:它导致如上所述的相同扰乱的IRQS / Rx / Tx字节。切换CS-USAGE OFF使所有信号可靠:
- setbits16(spi_ctrl_reg,spi_en_ctrl,0);
PLS。注意,SPI Master(STM32)生成良好的终端SPI信号,由LogicAnalyser解码而没有错误。主CS(当然是低效)在CLK开头以第一个子开始之前低至3美元,并在最后一个CLK转换后返回高〜7us(所有125 kHz SPI-CLK频率)。
所以我们的问题是:SPI_CLK和SPI_EN用法如上所述用于DA14580 SPI奴隶?
嗨Ralf S,
1)作为从站操作时,应该输入从站的SPI_CLK未输出,因为示例指示,我没有看到对PIN配置为输出时模块正常工作的事实的任何逻辑解释,除非其余的东西错误SPI初始化。尝试使用仅在解决您的问题的情况下使用。
2)是为了使580不忽视来自主服务器的CS,SPI_EN_CTRL应该被激活。SPI具有有效的低时钟使能SPI_EN,可以使用位SPI_EN_CTRL = 1启用。您是否将引脚配置为PROX_REPORTER_EXT_SPI在USER_PERIPH_SETUP.c文件中指示?您还能请检查Prox_Reporter_ext_spi中的从SPI初始化以验证您的SPI初始化配置吗?
谢谢mt_dialog.
这是我当前使用的代码,它有效良好:
Inside'user_periph_setup.h':
......
#define spi_en_gpio_port gpio_port_0.
#define spi_en_gpio_pin gpio_pin_2.
#define spi_clk_gpio_port gpio_port_0.
#define spi_clk_gpio_pin gpio_pin_0.
#define spi_do_gpio_port gpio_port_0.
#define spi_do_gpio_pin gpio_pin_5.
#define spi_di_gpio_port gpio_port_0.
#define spi_di_gpio_pin gpio_pin_6.
......
内部set_pad_functions():
gpio_configurepin(spi_en_gpio_port,spi_en_gpio_pin,input_pulldown,pid_spi_en,false);
//设置spi_clk_gpio_pin to input_pullup使spi无法使用!
gpio_configurepin(spi_clk_gpio_port,spi_clk_gpio_pin,输出,pid_spi_clk,false);
gpio_configurepin(spi_do_gpio_port,spi_do_gpio_pin,输出,pid_spi_do,false);
gpio_configurepin(spi_di_gpio_port,spi_di_gpio_pin,input_pulldown,pid_spi_di,false);
SPI init函数'spi_init(..)':
{
nvic_disableirq(spi_irqn);
setbits16(clk_per_reg,spi_div,0);/ *设置SPI内部时钟分频器* /
setbits16(clk_per_reg,spi_enable,1);//为spi启用时钟
setBits16(SPI_CTRL_REG,SPI_ON,0);//关闭SPI模块,如果打开
setbits16(spi_ctrl_reg,spi_word,0);//设置为8位模式
setbits16(spi_ctrl_reg,spi_smn,0x01);//在从动模式下设置SPI
setBits16(SPI_CTRL_REG,SPI_POL,0x0);//使用spi_pol = 0
setbits16(spi_ctrl_reg,spi_pha,0x0);//和spi_pha = 0
setbits16(spi_ctrl_reg,spi_mint,0x1);//使SPI可屏蔽中断到CPU
setbits16(spi_ctrl_reg,spi_clk,0x02);// SPI块时钟分频器默认为2 => 8 MHz
setbits16(spi_ctrl_reg1,spi_fifo_mode,0x03);// 0x03 =没有FIFO!
setBits16(SPI_CTRL_REG1,SPI_PRIORITY,0x01);//另外启用SPI高AHB总线优先级!
setbits16(spi_ctrl_reg,spi_en_ctrl,0);//不要使用SPI en PIN用于从模式
setbits16(spi_ctrl_reg,spi_on,1);//启用SPI模块
nvic_disableirq(spi_irqn);//首先禁用SPI中断到CPU
nvic_clearpendingirq(spi_irqn);
nvic_setpriority(spi_irqn,0);// prio 0最高,3最低
nvic_enableirq(spi_irqn);
}
我忘了说:我们正在使用pan1740与对话框 - evalkit-pro。
>尝试使用仅在解决您的问题的情况下使用。
我尝试了用'输入'和'input_pullup'的spi_clk,没有改进,仍然只与'输出'工作。
> SPI具有有效的低时钟使能SPI_EN,可以使用位SPI_EN_CTRL = 1启用。
这是数据表告诉的。但是,DA14580 SPI奴隶行为的具体后果是什么,特别是关于中断呼叫/持续时间/处理和RX / TX过程?
>您是否已将PIN配置为Prox_reporter_ext_spi指示user_periph_setup.c文件中的指示?
“prox_reporter_ext_spi”使用此配置(#1):
#define spi_gpio_port gpio_port_0.
#define spi_clk_pin gpio_pin_0.
#define spi_cs_pin gpio_pin_1.
#define spi_do_pin gpio_pin_2.
#define spi_di_pin gpio_pin_3.
我必须使用此配置(#2):
#define spi_gpio_port gpio_port_0.
#define spi_clk_gpio_pin gpio_pin_0.
#define spi_en_gpio_pin gpio_pin_2.
#define spi_do_gpio_pin gpio_pin_5.
#define spi_di_gpio_pin gpio_pin_6.
所以 - 除SPI_CLK之外 - 它完全重新映射。由于Devkit-Pro评估板上的免费/可用J5连接器,因此选择了映射。您是否在此配置中看到了问题?
PLS。注意,PAN1740模块外部SPI闪存连接到与(#2)中的相同SPI线 - 除了/ CS线之外:闪存/ CS连接P0_3!所以我们避免使用P0_3,保持高,当然是双重检查并测量以将其设置为高!
>你还可以检查从属SPI初始化
> prox_reporter_spi验证您的SPI初始化配置吗?
我使用'prox_reporter_ext_spi'spi_init(),就像:没有改进。我改编/测试PLO / PLO / PHA和FIFO模式:没有改进:RX数据加扰,MISO数据在时钟内未对齐(见附加ZIP)。
另外,我将SPI_CLK直接测量在PAN模块(SPI Flash)上的SPI_CLK设置为INPUT_PULLUP和B)设置为输出(参见附加ZIP)。您是否在CLK信号质量/级别中看到了任何问题?
所以,虽然我与你一样的看法,但它是不稳定的,它仍然适用于DA SPI_CLK作为从模式下的输出。你有更多的想法吗?
嗨Ralf S,
我可以在你的前一篇文章中看到你使用这个命令setbits_16(spi_ctrl_reg1,spi_priority,0x01),580没有dma,所以试着评论这个命令,如果出于某种原因它会导致您带来任何麻烦,请再次检查(虽然我不认为这是影响您的SPI通信的原因)。我没有看到您拥有的配置的任何问题。当SPI_CLK被配置为输出时,我可以看到的是O-Scope的图片电压约为2.6伏,这意味着两个芯片都驱动CLK线,并且由于使用这种配置,SPI工作将导致我带来可以以某种方式使用输出配置任何尖峰或时钟线反射的结论被滤出。就我理解的尖峰或信号反射可能很难追踪具有相对较低的采样频率的O-Scopes或分析仪,那种问题可能导致从奴隶上的采样器以被视为一个钉子的尖峰伪造样本时钟上升沿。这导致丢失位计数和接收移位数据。所以请尝试终止时钟电缆或在接收器侧涂抹上拉或拉下电阻(例如1K)。尝试在CS引脚上执行此操作。 Regarding the captures that you send can you please increase the sampling rate of the oscilloscope perhaps any abnormalities on your clock signal will show.
谢谢mt_dialog.
感谢您的提示,我仔细观察了线路信号(我的车辆使用250 Msamples),我看到Mosi Line的一些尖峰,在Spi_Clk的上升和Spi_Clk中间(采样时间),它是约300MV振幅和100ns宽度(见附件)。
对于测试,我将SPI源侧的电阻(R50)添加到所有四条线上,在MOSI线上完全在CLK上升沿移除并将SPI_CLK中间尖峰减少到170 mV:现在我可以使用DA14580作为SPI奴隶SPI_CLK引脚GPIO配置设置为INPUT_PULLUP(通常)。
但是CLK中间秒似乎仍然干扰长期SPI使用率:大约10 ...之后,DA开始再次发送扰乱数据,只能通过重置DA(PAN 1740模块)来解决。但这似乎是硬件问题,我希望在STM32评估和DA14580-Pro-套件之间使用更好的SPI电缆设置来解决。
此外 - 以下问题对我们来说仍然感兴趣:
>> SPI具有有效的低时钟使能SPI_EN,可以使用位SPI_EN_CTRL = 1启用。
>这是数据表告诉的。但DA14580 SPI奴隶行为的具体后果是什么?
>特别是关于中断呼叫/持续时间/处理和Rx / TX过程?
嗨Ralf S,
很高兴你工作了,你可以更具体地对你的问题,你是什么意思是什么具体的后果或SPI奴隶行为是什么?
谢谢mt_dialog.
> SPI具有有效的低时钟使能SPI_EN,可以使用位SPI_EN_CTRL = 1启用
它只是为了我的理解:我们使用/ CS行检测我们DA从站模式驱动程序中的已完成的SPI帧。在SPI主站(STM32)控制/ CS行(STM32)时发生问题(错误地手动)。我假设,如果spi_smn = 1和spi_en_ctrl = 1(从属与/ cs使用),只有在/ CS线路低,只有只要/ CS线路,就会生成SPI中断。没有SPI数据将进入 - 也没有发送 - SPI_RX_TX_REG0,只要/ CS都很高。正确的?
嗨Ralf S,
从侧的SPI_EN在SPI模块中充当时钟使能作为SPI模块的时钟使能作为SPI模块的时钟门,当SPI_EN被激活并且/ CS高并且从主侧有时钟上有时钟由于/ CS高,因此SPI模块上不会存在任何活动。总结,是的,只要保持CS高,就不会有数据交易。
谢谢mt_dialog.
感谢澄清!只是为了给您 - 和可能有兴趣的用户 - 我们的问题更新:
1)将线电阻器更换为R120使其非常稳定(在我们的适配器环境中!),MOSI线上的CLK-Spikes现在减少到〜100 mV,我们目前只能看到99500帧中的3个错误。
2)在DA14580中启用SPI_EN for SPI从模式使其更加强大:现在尖峰只做打扰_Current_帧。如果Master / CS再次高低,SPI奴隶再次开始新鲜,并且不再看到以前的尖峰引起的位移。因此,它建议使用SPI_EN,虽然只有一个奴隶可能正在侦听SPI。