我需要SPI头文件,所以我可以为两个PIC24FJ64GA002写一个SPI主机和从机.我有一个,但我不小心删除了它.请有人给我发送下载标题的链接.尽快,因为它是紧急的.
我正在使用STM32F103ZE我没有正确获取SPI数据.师父正确传播.但是,在发送非零值的情况下,始终读为零.
主配置:(MSP430)
The master configuration is correct. (I tested it.) Master Mode, MSB First, 8-bit SPI, Inactive state is high, SS grounded, 1 MHz clock, no dividers
Slave Config(STM32F103ZE)
Using SPI2.
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB
SPI_InitStructure.SPI_CRCPolynomial = 7
任何人都有答案,
谢谢哈里
我正在尝试编写一个将安装在Linux MCU(Raspberry Pi)上的程序,该程序将读取从另一个MCU(我将自己构建的本地产品)的串行数据.
我已经研究过如何做到这一点,并认为我有"大局",但仍然缺少一些东西.首先,我需要启用内核模块并让自己访问设备:
sudo modprobe spi_bcm2708
sudo chown `id -u`.`id -g` /dev/spidev0.*
Run Code Online (Sandbox Code Playgroud)
从那里我可以使用这个着名的C文件来测试SPI连接.
所以现在连接就在那里,但我仍然需要从中读取串行数据.根据这个问题的答案,我只需要:
...打开相关端口进行读取,并用于
read()获取数据.
然而,该答案中的代码片段似乎是通过设备驱动程序而不是通过SPI打开端口.
我的理解是,我可以使用SPI从所连接的MCU设备读取数据,而且我会不会需要写我自己的设备驱动程序为该设备.这是真的?如果是这样,我将如何从SPI连接中读取,以及该代码与上面链接的问题的答案中的代码有何不同?
如果我的理解不正确,并且我确实阅读了"通过"设备驱动程序,为什么我首先需要驱动程序?这不是SPI希望规避的吗?提前致谢.
我想使用 GPIO 引脚执行 SPI 协议操作,想配置为单从操作,我必须以这种方式进行配置,我使用 STM32F100RB 微控制器和 Coocox IDE 在 windowsxp 中执行此操作。
如果任何机构有关于使用 GPIO 引脚的 SPI 协议操作配置的示例源代码,请发送给我。它对我的项目非常有帮助,提前致谢。
问候,帕万尼奥。
我有一个有点爆炸的代码,它允许我通过 SPI 线发送大约 4 兆的数据。它的嵌入式代码用于使用 Linux 内核的自定义硬件。
问题是这需要很长时间才能完成(4 小时),这很可能是因为内核正在做更多的事情。基本上我的代码是这样的(aprox):
unsigned char data=0xFF;
BB_SPI_Init();
SPI_start();//activates chipselect(enable)
for(i=0;i<8;i++){
if(data & 0x80){
gpio_set_value(SPI_MOSI,1);
}else{
gpio_set_value(SPI_MOSI,0);
}
//send pulse clock
gpio_set_value(SPI_CLK,0);
gpio_set_value(SPI_CLK,1);
data<<=1;
}
SPI_stop();//deactivates chipselect(disable)
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的问题,但我注意到如果我使用 write 将数据发送到 linux gpio 处理程序/sys/class/gpio/gpioXX/value(其中 XX 是任何 gpio 编号),则需要 4 小时。但是,如果我fwrite()用于发送到同一台设备,则需要 3 个小时。但是,如果您write()仅用于启用(SPI_stop()和 SPI_ start())并fwrite()用于发送到 MISO、CLK,它只需要 1 小时 30 分钟。
那么,以此为基础,有人可以向我解释这是怎么发生的吗?我的想象说这是处理线程的方式,并且在每个软件周期中它解析 2 个线程(fwrite()和write()),如果只是使用的函数之一,但现在我仍在调查,有人可以让我知道任何类型的信息? 有没有更好的方法来处理这个问题?
仅供参考 无法使用内核驱动程序 spi,因为硬件已连接到 gpios,使用 bit bang …
嘿,我在自己的项目中使用 ADS1292,我自己对 SPI 协议感到困惑。
我在互联网上找到了一些代码,我发现它同时发送和接收。
例如,我想发送 0xFF 到从设备。
然后它首先发送数据并等待接收。
并且在接收数据时,发送一个虚拟字节然后接收。
有人请解释一下他们为什么这样做吗?
uint8_t sEE_ReadByte(void)
{
return (sEE_SendByte(sEE_DUMMY_BYTE));
}
uint8_t sEE_SendByte(uint8_t byte)
{
/*!< Loop while DR register in not empty */
while (SPI_I2S_GetFlagStatus(sEE_SPI, SPI_I2S_FLAG_TXE) == RESET);
/*!< Send byte through the SPI peripheral */
SPI_SendData(sEE_SPI, byte);
/*!< Wait to receive a byte => I do not understand this point*/
while (SPI_I2S_GetFlagStatus(sEE_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/*!< Return the byte read from the SPI bus */
return (uint8_t)SPI_ReceiveData(sEE_SPI);
}
Run Code Online (Sandbox Code Playgroud) 我有一个简单的项目,使用 CubeMX 创建用于外围设备初始化。
SPI 处于从机模式,并且似乎已正确初始化,但是当我对 8 位数据进行计时时,不会调用中断。
这是代码
/* SPI1 init function */
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我使用Winbond W25Q64 64-MB 串行闪存,当我阅读该串行闪存的数据表时,有两种类型:
SPI(W25Q64 闪存 ID:- 0xEF4017)和 QPI(W25Q64FV 闪存 ID:- 0xEF6017)。
我很了解SPI,但是我第一次听说QPI。所以我有一些问题-
1.SPI和QPI有什么区别?
2.我可以使用QPI通信类型的Flash(使用SPI)吗?
3.QPI的主要特点是什么?QPI(通信协议还是其他协议)是什么?
我刚刚开始对 STM32 进行编程,并使用 CubeMX 生成了一个代码,用于与陀螺仪 (L3GD20) 进行 SPI 通信。我对 HAL_SPI 命令有疑问。
我首先尝试读取WHO_AM_I返回良好响应(0xD4)的寄存器,然后我尝试对寄存器执行相同的操作CTRL_REG1,返回(0x07)仍然很好。
但是,如果我尝试一个接一个地获取它们,则会HAL_SPI_Receive不断发送第一个代码的数据HAL_SPI_Transmit...尝试为其提供其他缓冲区,但仍然不起作用。
这是我感兴趣的代码部分:
uint8_t txData[8],rxData[8]; //Buffers for the first read.
uint8_t rBuffer[8]; //Buffer for the second read.
/*...............................................................
*...............................................................
*...............................................................
*/...............................................................
txData[0] = ADDR_WHO_AM_I | 0x80;
HAL_SPI_Transmit(&hspi2, txData, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi2, rxData, 1, HAL_MAX_DELAY); //Returns the right value
HAL_Delay(1000);
txData[0] = ADDR_CTRL_REG1 | 0x80;
HAL_Delay(500);
HAL_SPI_Transmit(&hspi2, txData, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi2, rBuffer, 1, HAL_MAX_DELAY); //Returns the same value...
HAL_Delay(1000);
Run Code Online (Sandbox Code Playgroud)
PS:我还想了解更多有关HAL_SPI_TransmitReceive如果可能的话,我应该如何使用它来执行相同的任务?(从不同的寄存器读取 …
我试图使用相同的MISO,MOSI和CLOCK引脚同时控制两个SPI器件,但不同的SS引脚.
一个是来自SparkFun的Wifly 屏蔽,它使用SPI-to-UART芯片,另一个是MAX31855.
他们独立工作,但不是一起工作..
我正在使用的SPI-to-UART代码如下所示.我所做的唯一更改是在头文件中; 我设定select()并deselect()公开.
#include "SpiUart.h"
// See section 8.10 of the datasheet for definitions
// of bits in the Enhanced Features Register (EFR)
#define EFR_ENABLE_CTS 1 << 7
#define EFR_ENABLE_RTS 1 << 6
#define EFR_ENABLE_ENHANCED_FUNCTIONS 1 << 4
// See section 8.4 of the datasheet for definitions
// of bits in the Line Control Register (LCR)
#define LCR_ENABLE_DIVISOR_LATCH 1 << 7
// The original crystal …Run Code Online (Sandbox Code Playgroud) 我想在我的Raspberry上使用C#开始SPI通信。bcm2835库支持所需的命令,例如:
bcm2835_spi_begin()bcm2835_spi_end()在C中,您必须执行,#include < bcm2835.h >但在C#using bcm2835;中不起作用。
RaspberryPiDotNet已安装,并且bcm2835库也已安装。
可以通过GPIOMem使用bcm2835库的命令来控制GPIO引脚。
C#如何使用bcm2835的SPI命令?网上的所有内容都适用于C或C ++。
我试图通过Raspberry Pi上的SPI端口读取刺痛.这是我测试端口的代码:
raw = 0
string = ""
SPI = spidev.SpiDev()
SPI.open(0,0)
while True:
raw = SPI.xfer2([0])
string += str(chr(raw))
print string
print raw
time.sleep(0.2)
Run Code Online (Sandbox Code Playgroud)
结果是"Hell insert gibberish ",所以它在第四个字符后失败了.我尝试发送"Hello World!" 我发送的数据被格式化为列表中的字符,例如"Hello"看起来像[72,101,108,108,111].如何将其转换为字符串?
答案很有用,因为我不知道如何转换数据.然而真正的问题是我正在与之接口的设备.答案对于找到真正的问题非常有用,非常感谢!我仍然是python的新手,所以这些东西都有点麻烦.
spi ×13
c ×4
embedded ×4
stm32 ×4
arduino ×1
bitstream ×1
c# ×1
coocox ×1
dll ×1
dummy-data ×1
gpio ×1
hal ×1
interfacing ×1
interrupt ×1
linux ×1
linux-kernel ×1
list ×1
microchip ×1
pic ×1
python ×1
raspberry-pi ×1
serial-port ×1
string ×1