我们使用PAN1740作为SPI从端(SPI_SMN = 1),同时使用STM32作为主端。我们目前连接/CS, CLK, MISO和MOSI和GND(没有进一步的握手线)。主机驱动SPI时钟与125 kHz,共同GND是保证,O-Scope显示良好的终止线信号。我们在DA14580中启用了SPI中断(SPI_MINT=1)模式,并以无fifo模式接收/发送(SPI_FIFO_MODE=0x03)现在工作。但是为了使它工作,我们需要DA14580从模式的一个奇怪的SPI配置,所以我们假设,我们仍然有配置问题:
1) SPI Slave需要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, OUTPUT, PID_SPI_CLK, false);
2) SPI Slave应该忽略主CS (SPI_EN)?
我们启用DA14580 SPI从CS使用,如演示代码和HCI演示所述,以使用主驱动CS:
——SetBits16 (SPI_CTRL_REG SPI_EN_CTRL 1);
但与上述条件一起,它不起作用:它导致如上所述的相同扰乱的IRQS / Rx / Tx字节。切换CS-USAGE OFF使所有信号可靠:
- setbits16(spi_ctrl_reg,spi_en_ctrl,0);
请注意,SPI Master (STM32)产生终止良好的SPI信号,由LogicAnalyser解码没有错误。Master CS(当然是低活性的)在CLK开始第一次过渡之前到LOW ~7us,并在最后一次CLK过渡之后回到HIGH ~7us(所有125 kHz SPI-CLK频率)。
所以我们的问题是:如上所述,SPI_CLK和SPI_EN的使用是否用于DA14580 SPI从服务器?
嗨,拉尔夫年代,
1)作为从站操作时,应该输入从站的SPI_CLK未输出,因为示例指示,我没有看到对PIN配置为输出时模块正常工作的事实的任何逻辑解释,除非其余的东西错误SPI初始化。尝试使用仅在解决您的问题的情况下使用。
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
这是我目前正在使用的代码,它工作得很好:
Inside'user_periph_setup.h':
...
#定义SPI_EN_GPIO_PORT GPIO_PORT_0
#定义SPI_EN_GPIO_PIN GPIO_PIN_2
#定义SPI_CLK_GPIO_PORT GPIO_PORT_0
#定义SPI_CLK_GPIO_PIN GPIO_PIN_0
#定义SPI_DO_GPIO_PORT GPIO_PORT_0
#定义SPI_DO_GPIO_PIN GPIO_PIN_5
#定义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设置为INPUT_PULLUP使SPI不可用!
GPIO_ConfigurePin(SPI_CLK_GPIO_PORT, SPI_CLK_GPIO_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_DO_GPIO_PORT, SPI_DO_GPIO_PIN, OUTPUT, 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 0 x01);//设置从模式的SPI
SetBits16 (SPI_CTRL_REG SPI_POL 0 x0);//使用sp_pol = 0
SetBits16 (SPI_CTRL_REG SPI_PHA 0 x0);//和sp_pha = 0
SetBits16 (SPI_CTRL_REG SPI_MINT 0 x1);//启用SPI可屏蔽中断到CPU
SetBits16 (SPI_CTRL_REG SPI_CLK 0 x02);// SPI块时钟分配器默认2 => 8 MHz
SetBits16 (SPI_CTRL_REG1 SPI_FIFO_MODE 0 x03);// 0x03 = no FIFOs!
SetBits16 (SPI_CTRL_REG1 SPI_PRIORITY 0 x01);//另外启用SPI高AHB总线优先级!
SetBits16 (SPI_CTRL_REG SPI_EN_CTRL 0);//不使用SPI EN引脚从模式
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与Dialog-Evalkit-Pro。
>尝试使用仅在解决您的问题的情况下使用。
我用'INPUT'和'INPUT_PULLUP'尝试了SPI_CLK,没有改进,仍然只能用'OUTPUT'。
> SPI有一个激活的低时钟使能SPI_EN,可以通过SPI_EN_CTRL = 1位使能。
这是数据表告诉我们的。但是DA14580 SPI从行为的具体后果是什么,特别是关于中断调用/持续时间/处理和rx/tx进程?
>是否按照user_peripher_setup .c文件中的prox_reporter_ext_spi配置pin ?
“prox_reporter_ext_spi”使用此配置(#1):
#定义SPI_GPIO_PORT GPIO_PORT_0
#定义SPI_CLK_PIN GPIO_PIN_0
#定义SPI_CS_PIN GPIO_PIN_1
#define spi_do_pin gpio_pin_2.
#定义SPI_DI_PIN GPIO_PIN_3
我必须使用这个配置(#2):
#定义SPI_GPIO_PORT GPIO_PORT_0
#定义SPI_CLK_GPIO_PIN GPIO_PIN_0
#定义SPI_EN_GPIO_PIN GPIO_PIN_2
#定义SPI_DO_GPIO_PIN GPIO_PIN_5
#define spi_di_gpio_pin gpio_pin_6.
所以 - 除SPI_CLK之外 - 它完全重新映射。由于Devkit-Pro评估板上的免费/可用J5连接器,因此选择了映射。您是否在此配置中看到了问题?
请注意,PAN1740模块外部SPI闪存连接到相同的SPI线,如(#2)-除了/CS线:flash /CS连接P0_3!因此,我们避免使用P0_3,保持它的高,当然,双重检查和测量,以设置为高!
你能不能也检查从spi的初始化
> prox_reporter_ext_spi来验证spi初始化配置?
我使用'prox_reporter_ext_spi'spi_init(),就像:没有改进。我改编/测试PLO / 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作为OUTPUT使用。你有进一步的想法吗?
嗨,拉尔夫年代,
我可以在你的前一篇文章中看到你使用这个命令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宽度(见附件)。
我添加了电阻测试(R50)在SPI源端到所有四行,莫西人行删除了峰值完全CLK前沿和减少了SPI_CLK中产峰值170 mV:现在我可以使用DA14580作为SPI奴隶与SPI_CLK销GPIO配置设置为INPUT_PULLUP(一般)。
但是CLK中间峰值似乎仍然干扰SPI的长期使用:大约10..60分钟后,DA开始再次发送乱码数据,只能通过重置DA (PAN 1740模块)来解决。但这似乎是硬件问题,我希望可以通过STM32 evalboard和DA14580-Pro-Kit之间更好的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模块的时钟门,当SPI_EN被激活并且/ CS高并且从主侧有时钟上有时钟由于/ CS高,因此SPI模块上不会存在任何活动。总结,是的,只要保持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。