我们使用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作为输出?
首先,我们为SPI_CLK (Port/Pin p0 _ 0)配置了GPIO来输入,就像几个演示代码和HCI演示一样:
- gpio_configurepin(spi_clk_gpio_port,spi_clk_gpio_pin,input_pullup,pid_spi_clk,false);
但是这会导致丢失SPI中断、被干扰的接收/发送字节和被干扰的MISO行使用(不是MISO的CLK对齐过渡)。一旦我们将SPI_CLK引脚改为OUTPUT(对于Slave !?),它就工作得很好:
- gpio_configurepin(spi_clk_gpio_port,spi_clk_gpio_pin,输出,pid_spi_clk,false);
2) SPI Slave应该忽略主CS (SPI_EN)?
我们启用了DA14580 SPI从站使用,如演示代码和HCI演示中所述,用于使用主驱动CS:
——SetBits16 (SPI_CTRL_REG SPI_EN_CTRL 1);
但是如果加上上面的条件,它就不起作用了:它会导致同样的IRQs/Rx/Tx字节。关闭cs使用使所有信号可靠:
——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奴隶?
嗨,拉尔夫年代,
1)操作时作为奴隶的SPI_CLK奴隶应该INPUT_PULLUP不输出显示的例子中,我没有看到任何合理的解释一个事实模块正常工作时销被配置为输出,除非有问题其他的spi初始化。尝试使用just INPUT来解决您的问题。
2)是的,为了580不忽略来自master的CS,应该激活SPI_EN_CTRL。SPI有一个激活的低时钟使能SPI_EN,它可以通过SPI_EN_CTRL = 1位启用。您是否按照user_peripher_setup .c文件中的prox_reporter_ext_spi配置了pin ?您还可以检查prox_reporter_ext_spi中的从spi初始化,以验证您的spi初始化配置吗?
谢谢mt_dialog.
这是我目前正在使用的代码,它工作得很好:
在“user_periph_setup.h”:
......
#define spi_en_gpio_port gpio_port_0.
#define spi_en_gpio_pin gpio_pin_2.
#定义SPI_CLK_GPIO_PORT GPIO_PORT_0
#定义SPI_CLK_GPIO_PIN GPIO_PIN_0
#define spi_do_gpio_port gpio_port_0.
#define spi_do_gpio_pin gpio_pin_5.
#定义SPI_DI_GPIO_PORT GPIO_PORT_0
#定义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 0 x1);//启用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。
>尝试使用just INPUT来解决你的问题。
我尝试了用'输入'和'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.
#定义SPI_DO_PIN GPIO_PIN_2
#定义SPI_DI_PIN GPIO_PIN_3
我必须使用此配置(#2):
#define spi_gpio_port gpio_port_0.
#定义SPI_CLK_GPIO_PIN GPIO_PIN_0
#define spi_en_gpio_pin gpio_pin_2.
#define spi_do_gpio_pin gpio_pin_5.
#定义SPI_DI_GPIO_PIN GPIO_PIN_6
所以-除了SPI_CLK -它是完全重新映射的。选择映射是因为DevKit-Pro evalboard上有免费/可用的J5连接器。您在这个配置中看到问题了吗?
请注意,PAN1740模块外部SPI闪存连接到相同的SPI线,如(#2)-除了/CS线:flash /CS连接P0_3!因此,我们避免使用P0_3,保持它的高,当然,双重检查和测量,以设置为高!
>你还可以检查从属SPI初始化
> prox_reporter_spi验证您的SPI初始化配置吗?
我使用了'prox_reporter_ext_spi' spi_init():没有任何改进。我适应/测试PLO/PHA和FiFo模式:没有改善:Rx数据混乱,MISO数据在时钟上不对齐(见附件ZIP)。
另外,我在PAN-Module上直接测量了SPI_CLK (SPI flash上的CLK), DA a) SPI_CLK设置为INPUT_PULLUP, b)设置为OUTPUT(见附件ZIP)。你看到CLK信号质量/电平有什么问题吗?
所以,虽然我与你一样的看法,但它是不稳定的,它仍然适用于DA SPI_CLK作为从模式下的输出。你有更多的想法吗?
嗨,拉尔夫年代,
在以前的文章我能看到你,你使用这个命令SetBits_16 (SPI_CTRL_REG1 SPI_PRIORITY 0 x01), 580年没有一个DMA所以尝试注释掉这个命令,请再次检查如果由于某种原因造成你任何麻烦了(虽然我不认为这是什么影响你的SPI通信)。我看你们的配置没有任何问题。我能看到的是O-Scope的图片,当SPI_CLK被配置为输出电压约为2.6伏特,这意味着两个芯片都在驱动CLK线,由于使用这种配置SPI工作,它使我得出结论,也许在输出配置中,时钟线上的任何尖峰或反射都被过滤掉了。据我所知,O-Scopes或分析仪在采样频率相对较低的情况下很难跟踪尖波或信号反射,这些问题会导致从端采样器在一个被认为是时钟上升沿的尖波上错误采样。这将导致丢失比特计数和接收移位的数据。因此,请尝试终止您的时钟电缆或在接收器端应用一个上拉或下拉电阻(例如1K)。试着在CS引脚上做同样的事情。关于您发送的捕获信号,能否提高示波器的采样率,也许您的时钟信号会显示出任何异常。
谢谢mt_dialog.
谢谢你的提示,我仔细看了进线信号(我OScope使用250 MSamples)我看到一些峰值莫西人,前沿SPI_CLK和中期的SPI_CLK(采样时间),它是关于300 mV振幅和100 ns宽度(见附件)。
我添加了电阻测试(R50)在SPI源端到所有四行,莫西人行删除了峰值完全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过程?
嗨,拉尔夫年代,
很高兴你已经让它工作了,你能不能更具体地谈谈你的问题,具体的结果是什么或者SPI从行为是什么意思?
谢谢mt_dialog.
> SPI具有有效的低时钟使能SPI_EN,可以使用位SPI_EN_CTRL = 1启用
这只是为了我的理解:我们使用/CS线来检测DA从模式驱动程序中完成的SPI帧。这个问题是在SPI主机(STM32)(错误地手动)控制/CS行时发生的。我假设,如果SPI_SMN=1和SPI_EN_CTRL=1(使用/CS的Slave), SPI中断只会生成,只要/CS行是低的,并且只有/CS行是低的。只要/CS为HIGH, SPI数据就不会到达SPI_RX_TX_REG0,也不会通过SPI_RX_TX_REG0发送。正确吗?
嗨,拉尔夫年代,
奴隶一侧SPI_EN作为时钟实现SPI模块,使用时充当时钟门SPI模块,当SPI_EN激活/ CS高和有时钟的奴隶主人方面不会有任何活动以来的SPI模块/ CS很高。综上所述,是的,只要你保持CS高,就不会有数据交易。
谢谢mt_dialog.
谢谢你澄清!为了给你——以及可能感兴趣的用户——我们的问题的更新:
1)将线路电阻更改为R120使其非常稳定(在我们的适配器环境中!),MOSI线路上的CLK-Spikes现在减少到~100 mV,目前我们在99500帧中只看到3个错误。
2)在DA14580中启用SPI从模式的SPI_EN使其更健壮:现在尖峰只做干扰当前帧。如果主/CS去到高和低再次,SPI从重新开始,不再看到一个bit移位造成的前spike。所以建议使用SPI_EN,尽管只有一个slave可能在监听SPI。