我有一个使用SPI进行通信的芯片,并希望将其直接连接到我的计算机上的USB端口.有没有人有使用USB转SPI转换器的经验?有什么建议?网上快速搜索显示
http://www.robotshop.com/devantec-usb-i2c-spi-serial-interface.html
有没有人能给我一些实际的例子,其中SPI通信中的4种CPOL/CPHA配置模式是有用的吗?我理解他们是如何工作但却不知道何时使用它们.由于非标准的实现,我很快就读了一些关于兼容性的参考,这是怎么回事?
谢谢
我已经在NOOBS Raspbian PI发行版上安装了wiringpi2和wiringpi2 python包装器.Adafruit 4通道逻辑电平转换器将PI保持在5v以下,并且在PI端向Arduino发送数据就像这样简单:
import wiringpi2
wiringpi2.wiringPiSPISetup(1,5000)
wiringpi2.wiringPiSPIDataRW(1,'HELLO WORLD\n')
Run Code Online (Sandbox Code Playgroud)
和相应的Arduino代码[3].
编辑:道歉 - 从这一点开始,我不能发布任何我仔细添加的链接来显示我的工作,来源和示例代码.你必须谷歌它并感谢双链接规则.
所以,我知道布线工作.但这不是我真正想要的方式 - 我想读一个从Arduino到PI的引脚.
Arduino SPI参考指出:
该库允许您与SPI设备通信,Arduino作为主设备.
PI必须是主设备.我以为自己注定要失败,直到我读到Nick Gammon关于SPI的优秀网页,它展示了2个Arduinii互相交谈.
此外,SPI transfer()命令会建议您从Arduino写入.
我现在处于Google的前4个结果页面的所有链接显示为"跟随"的阶段 - 所以这不是因为缺少谷歌搜索!
理论上,如果我在PI端使用READ方法,这不应该工作吗?(注意:这只是众多尝试中的一种,而不是唯一的尝试!)
在Arduino上:
#include <SPI.h>
void setup (void)
{
SPI.begin();
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode
SPCR |= _BV(SPE);
}
void loop (void) {
byte data[] = {0x00, 0x00, 0x00, 0x00}; // this is 24 bits (8bits/byte * 4 bytes)
// Transfer 24 bits …Run Code Online (Sandbox Code Playgroud) 我有一个ARM处理器,能够与外部闪存芯片连接.写入芯片的是为ARM架构编译的程序,可以执行.我需要知道的是将外部闪存中的数据传输到ARM处理器上以便执行.
我可以提前运行某种复制例程,将数据复制到可执行存储空间吗?我想我可以,但ARM处理器正在运行一个操作系统,我没有足够的空间在闪存中使用.我还希望能够一次安排两个甚至三个程序的执行,并且一次将多个程序复制到内部闪存是不可行的.操作系统可以用于在可访问的内存空间内启动程序,因此任何需要事先完成的操作都可以.
我在主模式下使用STM32F205的SPI1.并且在事务期间永远不会设置RXNE标志.这是SPI初始化的一部分:
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM | SPI_CR1_SPE;
SPI1->CR2 = 0;
Run Code Online (Sandbox Code Playgroud)
然后我试图执行传输/接收单个字节:
while(!(SPI1->SR & SPI_FLAG_TXE)) {} // wait for compeltion of the previous Tx
SPI1->DR = 0xAB; // transmit some byte
while(!(SPI1->SR & SPI_FLAG_RXNE)) {} // wait for byte to be received
uint8_t result = SPI1->DR;
Run Code Online (Sandbox Code Playgroud)
这段代码停留在等待RXNE标志.我试着等待繁忙的旗帜BSY = 0而不是RXNE = 1SPI开始工作.似乎RXNE从未设置过.
我一直试图移植一些我的AVR代码来驱动一个简单的SPI LCD到ARM作为一个学习练习(我对ARM一般都很新).为此,我只需要在主模式下使用SPI.
我查看了器件的数据表(STM32F103C8),发现我需要的SPI1引脚,SCK和MOSI分别映射为PA5和PA7的替代功能,以及其他外设(第29页).我的理解是,为了在这些引脚上使用SPI功能,我需要确保禁止映射到同一引脚的任何其他内容.但是,在查看外设时钟控制寄存器的默认值时,看起来其他功能已被禁用.
我查看了参考手册中的SPI部分,包括第25.3.3节- 在主模式下配置SPI.首先,我在APB2ENR中启用SPI1主时钟,然后按照本节中的步骤将SPI1配置为我的需要.我还更改了PA5/7的设置,将其模式设置为"Alternate Function Output push-pull"(9.1.4).最后,我通过设置CR1_SPE来启用SPI1.
从我的阅读中,我曾想过,如上所述配置SPI后,通过将值加载到SPI1数据寄存器中,数据将被移出.但是,写入数据后,SPI状态寄存器中的TXE标志永远不会置位,表示我写入的数据只是坐在那里.
在这一点上,我假设还有一些我无法正确配置的东西.例如,我不能100%确定如何处理PA5/7引脚.我试图从数据表中了解我能做什么,但我没有得到任何结论.在它工作之前还有什么需要做的吗?
我想通过其I2S外设从STM32(Cortex M4)设备发送数据,使用24位模式的DMA,MSB优先.然而,I2S数据寄存器只有16位,根据数据表,您必须首先发送上半字,然后是下半字.这在使用DMA时会出现问题,它将始终首先发送下半字.
在c或ARM-assembler中切换两个半字的有效方法是什么?
我正在尝试在我的 Keycloak 服务器上创建一个自定义资源来扩展它的其余 API。所以我正在实施一个SPI。从你好世界开始。
目前我的目标是通过http://localhost:8080/auth/admin/realms/myRealm/hello上的 GET 获取“hello”+ 名称
我使用 Postman 请求服务器。我能够在 myRealm 上获得用户令牌。我选择了一个我View-users在realm-managmentMapper 中为其分配了角色的用户。
所以内置的 Keycloak Admin API 可以工作。例如:http://localhost:8080/auth/admin/realms/myRealm/users/count 返回预期的用户数。
但问题是我在请求此端点时收到“错误”:“RESTEASY003210:找不到完整路径的资源:http://localhost:8080/auth/admin/realms/myRealm/hello/ ”。
这是我的设置(我阅读了几篇指南):
模块项目的 pom.xml 包含对 keycloak-core keycloak-server-spi keycloak-server-spi-private org.jboss.spec.javax.ws.rs
RealmResourceProvider 实现:
public class HelloWorldProvider implements RealmResourceProvider {
private KeycloakSession session;
public HelloWorldProvider(KeycloakSession session) {
this.session = session;
}
@Override
public Object getResource() {
return this;
}
@GET
@Path("/hello")
@Produces("text/plain; charset=utf-8")
public String get() {
String name = session.getContext().getRealm().getDisplayName();
if (name == …Run Code Online (Sandbox Code Playgroud) 我使用WinBond W25Q64JV SPI Flash芯片来存储数据,微控制器是STM32F101RCT6。当我尝试将数据存储在华邦芯片中时,它工作正常,我可以在华邦芯片中读取和写入数据,但如果我想覆盖同一地址中的新数据,它不会被覆盖,并且会提供旧数据新数据未写入同一内存中。如果我使用擦除选项,则会擦除所有地址位置中的所有数据,我无法擦除特定地址数据。删除所有地址数据后,我可以写入新数据,但我正在丢失所有其他位置的数据,因此请指导我覆盖同一地址位置中的新数据/特定地址的擦除选项,我的代码如下
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x06; //Write Enable
HAL_SPI_Transmit(&hspi2,Spi_data,1,1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x02; //Page Program
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
Spi_data[4]=0x43;
HAL_SPI_Transmit(&hspi2,Spi_data,5,10000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x03;//Read Data
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
HAL_SPI_Transmit(&hspi2,Spi_data,4,100);
HAL_SPI_Receive(&hspi2,GSdata,4,100);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)
当我尝试覆盖 0x1014 位置中的新数据时,如果我使用以下擦除选项,它不会被覆盖,它会擦除所有内存地址数据
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x20;//Erase
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
HAL_SPI_Transmit(&hspi2,Spi_data,4,1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)
请指导我覆盖同一地址中的新数据/特定地址的擦除选项