当前位置: 首页 > 知识库问答 >
问题:

在Arduino上设置ATSAM3X8E由于SPI从操作

米景辉
2023-03-14

我正试图通过SPI在树莓皮3B和Arduino之间建立沟通。我选择了覆盆子皮做主人,阿尔杜伊诺做奴隶。因此,我为Raspberry编写了一些C代码,用于配置接口并通过MOSI线发送两个字节的数据。我用逻辑分析仪观察信号,它们与预期一样,芯片选择在发送过程开始时下降到零,然后再次上升。

对于Arduino的编程,我正在使用Arduino IDE。由于Arduino SPI.h不支持从模式,我想直接访问ATSAM3X8E上的相应寄存器。首先,我将SPI引脚的模式(来自“非官方”到期引脚的引脚号)定义为输入/输出。之后,我为SPI从机操作配置ATSAM3X8E的寄存器。CPOL和CPHA的设置与Raspberry上的设置相同。由于串行时钟波特率的devider不允许为零,因此我选择了可用的最大devider,尽管我假设此设置无效,因为主机定义了传输速度。以下是配置代码:

pinMode(74, OUTPUT);  // PIN_SPI_MISO
pinMode(75, INPUT);   // PIN_SPI_MOSI
pinMode(76, INPUT);   // PIN_SPI_SCK
pinMode(10, INPUT);   // Slave Select

REG_SPI0_CR   = 0x00000001;   // SPI Enable 

REG_SPI0_MR   = 0x00000000;   // Slave-Mode, Fixed Peripheral Select, 
                              // Chip  Select directly connected
                              // Mode Fault detection enabled, 
                              // Loopback disabled

REG_SPI0_WPMR = 0x00000000;   // Write Protection disabled

REG_SPI0_CSR  = 0x0000ff02;   // Chip select Register
                              // CPOL = 0, CPHA = 1 
                              // 8 Bit per transfer
                              // serial Clock Baud Rate of 84 MHz/255=330 kHz 

之后,在循环中,数据接收寄存器的位存储在缓冲器中:

unsigned int buf = 0;
buf = REG_SPI0_RDR & 0x0000ffff; // store 16 Bits of Receive Data Registers in buffer

但是,缓冲区仍然为空。如果我读取状态寄存器的位,则所有位都为零,甚至“检测到NSS上升沿”或“SPI Enbled”的位也为零。因此,我假设接口的初始化不正确/不完整。我错过什么了吗?

非常感谢您的帮助。

共有1个答案

鲁建茗
2023-03-14

使用pinMode(74,输出)和类似的Arduino函数调用您只更改管脚方向,而不更改管脚作为GPIO的用法。要使用这些引脚作为SPI线,您应该设置引脚多路复用器。

请参见ATSAM3X8E数据表中的

  • 9.3 I/O线路上的外围信号复用
  • 引脚复用
 类似资料:
  • 首先,如果这个问题再次出现,我表示歉意。 我在Arduino Mega和SPI中使用两个DWM1000模块(数据表:Decawave DWM1000)与他们通信。我只有一个模块通信没有问题。但是我需要至少使用两个模块,一个是发射器,另一个是接收器。 是否可以指定除引脚53(默认芯片选择引脚)之外的另一个GPIO引脚作为第二个模块的SS引脚? 这种尝试是正确的吗?

  • 因此,我试图将一些用于操作LCD的代码从Arduino翻译为MSP430F5529的C。LCD使用SPI进行通信,我不清楚这段代码是如何使Arduino与之正确通信的,我希望有经验的人能够解释一些事情(我从未使用过)。最后我链接到了pastebin上的整个程序,但这是我现在关注的部分: 因此,我理解任何与将Arduino上的一些数字管脚设置为高或低有关的代码(看起来它们只是输出,因为程序从未为它们

  • 我使用SPI通信尝试连接我的Arduino Mega 2560作为主从ADC芯片()在外部时钟模式,但我一直收到相同的值或所有零每当我运行我的代码。还有一个触摸屏(工作)连接。除了与Arduino的ADC芯片通信外,一切正常。 我尝试删除定义头,并改变时钟。也不要改变任何东西(这可能是因为其他错误)。 错误包括RB1=255;RB2=255;RB3=255或全部为零。

  • SPI 简介 SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。SPI 一般使用 4 根线通信,如下图所示: MOSI –主机输出 / 从机输入数据线(SPI Bus Master Output/Slave Input

  • 简介 SPI 是一种高速、全双工、同步串行通信总线,常用于 MCU 与数字芯片之间的短距离通讯。RT-Thread 的 SFUD 组件,RW007 WIFI 模块均使用到了 SPI 驱动。下面将基于 stm32l475-atk-pandora 开发板,讲解基于 RT-Thread Studio 开发 SPI 驱动。 SPI 设备驱动的开发可总结为如下: 新建 RT-Thread 完整版项目 打开

  • 问题内容: 在Java中是否存在用于集合操作的API,例如联合,交集,差,笛卡尔乘积,从一个集合到另一个集合的函数,这些函数的域限制和范围限制,.... Java? 请评论(操作)的覆盖范围和性能。 谢谢 问题答案: 是的,java 类。 通过Java SE教程: —如果s2是s1的子集,则返回true。(如果集合s1包含s2中的所有元素,则s2是s1的子集。) —将s1转换为s1和s2的并集。(