标签: spi

使用 STM32 MCU 和低级 LL API 通过 SPI 发送数据

我的板是 nucleo STM32L432KCU 板。我正在尝试使用低级 API 通过 SPI 发送字符。SPI 配置为“仅发送主机”并且硬件 NSS 信号被禁用。

不幸的是,我的代码不起作用(见下文)。当我连接逻辑分析仪时,我看不到任何东西。

这是我的代码:

SPI初始化(由CubeMX生成)

void MX_SPI1_Init(void)
{
  LL_SPI_InitTypeDef SPI_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;
  /* Peripheral clock enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);

  /**SPI1 GPIO Configuration  
  PA1   ------> SPI1_SCK
  PA7   ------> SPI1_MOSI 
  */
  GPIO_InitStruct.Pin = SCLK1_to_SpW_Pin|MOSI1_to_SpW_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_5;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
  SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
  SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
  SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
  SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE;
  SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
  SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8;
  SPI_InitStruct.BitOrder = …
Run Code Online (Sandbox Code Playgroud)

spi stm32 low-level

4
推荐指数
1
解决办法
1万
查看次数

STM32 SPI慢速计算

我正在使用STM32F4及其SPI与本教程中的74HC595进行通信。区别在于初学者,为简单起见,我使用非DMA版本。我使用STMCubeMX配置SPI和GPIO

问题是:我没有获得锁存器PIN,我将其设置为PA8以在传输期间足够快地切换。

在此处输入图片说明

我正在使用的代码:

        spiTxBuf[0] = 0b00000010;

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);


        HAL_SPI_Transmit(&hspi1, spiTxBuf, 1, HAL_MAX_DELAY);
//        while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);

        HAL_Delay(1);
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情:

  1. 将引脚PA8的最大输出速度设置为非常快 在此处输入图片说明

  2. 等待SPI完成(请参见上面的注释行)

  3. 如此处所示,将DMA用于SPI,这实际上使它变慢了。

我如何才能更快地切换?我应该在SPI完成后创建并中断并在那里设置锁存器吗?

embedded spi stm32

4
推荐指数
2
解决办法
295
查看次数

在 STM32 传输结束时,循环 DMA 外围到内存的行为如何?

我想问一下,在以下情况下,STM32 中的 DMA SPI rx 将如何表现。我有一个名为 A 的指定(例如)96 字节数组,用于存储从 SPI 接收到的数据。我打开对每个字节进行操作的循环 SPI DMA,配置为 96 字节。是否有可能,当 DMA 将填充我的 96 字节数组时,传输完成中断将关闭,以快速将 96 字节数组复制到另一个 - B,然后循环 DMA 将开始写入 A(并破坏保存在 B 中的数据) ? 我想通过 USB 将数据从 B 快速传输(每次我从 B 中的 A 获取新数据时)到 PC。

我只是在想如何通过 USB 将 STM32 的连续数据流 SPI 传输到 PC,因为我认为每隔一定时间通过 USB 传输的 96 字节数据块比通过 STM32 将实时 SPI 流传输到 USB 更容易?我不知道这甚至可能

embedded usb spi stm32 dma

4
推荐指数
1
解决办法
5799
查看次数

通过串口通信的任何更高级协议?

我们正在开设机器人课程,Xbee是学生最喜欢的通信协议.在过去的两年里,我们帮助他们建立了大约62个不同的项目(40个以上的项目).

所有项目都涉及向机器人发送不同类型的数据.有时它是一个1字节的命令,有时它是一个要解释的长字符串.有时,当在广播模式中使用一个xbee向几个特定机器人发送消息时,我们会遇到寻址机器人的问题.学生每次都会利用他们的创造力来解决这个问题.

我个人觉得这是重新投资的轮子.我想知道是否有任何更高级别的协议提议用于串口通信,如果没有任何特定的协议设计,我想知道是否值得为学生需要设计一个.

embedded communication spi xbee

3
推荐指数
1
解决办法
1490
查看次数

stm32 DMA无法向SPI1 DR发送数据(不能使用DMA向SPI发送数据)

我正在尝试使用DMA将数据发送到SPI1.然后SPI1将控制DAC以进行电压更新.

使用的芯片是STM32F407.因此,相应的频道/流是:channel3/stream5,如参考手册中所示.但是,当DMA使能时,SPI1-> DR中不显示任何数据,示波器中没有显示结果.

当SPI1-> DR由软件写入时,SPI工作正常.谁能帮忙看看发生了什么?代码如下:

uint16_t DACData[1]; 
void InitDMA(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    DMA_Cmd(DMA2_Stream2, DISABLE);
    while (DMA2_Stream2->CR & DMA_SxCR_EN);
    //SPI1 Tx DMA
    DMA_DeInit(DMA2_Stream5);
    DMA_StructInit(&DMA_InitStructure);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //Init DMA clock
    DMA_InitStructure.DMA_Channel = DMA_Channel_3;//SPI1 Tx 
    DMA_InitStructure.DMA_PeripheralBaseAddr  = (uint32_t)&(SPI1->DR); //Set the SPI1 Tx
    DMA_InitStructure.DMA_Memory0BaseAddr  = (uint32_t)&DACData;       //Set the memory location
    DMA_InitStructure.DMA_DIR  = DMA_DIR_MemoryToPeripheral;           //
    DMA_InitStructure.DMA_BufferSize  = 1;            //Define the number of bytes to send
    DMA_InitStructure.DMA_PeripheralInc  = DMA_PeripheralInc_Disable;             
    DMA_InitStructure.DMA_MemoryInc  = DMA_MemoryInc_Disable;            
    DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;    
    DMA_InitStructure.DMA_MemoryDataSize  = DMA_PeripheralDataSize_HalfWord;        
    DMA_InitStructure.DMA_Mode  = DMA_Mode_Normal;               //Normal mode (not circular)
    DMA_InitStructure.DMA_Priority …
Run Code Online (Sandbox Code Playgroud)

spi stm32 dma stm32f4discovery

3
推荐指数
1
解决办法
5977
查看次数

GPIO和SPI有什么关系?

我发现内核中的GPIO驱动程序留下/sys/class/gpio来控制gpio,但我发现GPIO也可以被控制/dev/mem,我发现这个映射可能在spi-bcm2708(它调用__ioremap作为平台驱动程序)中完成,但我不这样做了解spi和GPIO之间的关系,它们在linux中如何协同工作?

driver spi linux-kernel gpio raspberry-pi

3
推荐指数
1
解决办法
1987
查看次数

在STM32F303上使用SPI的SD卡初始化问题

当我发送CMD0命令(0x40 0x00 0x00 0x00 0x00 0x95)时,我试图在STM32F303上使用SPI初始化SDCard,我试着看一下示波器上来自MOSI的信号,我看到了不同的信号,如下图所示.请注意,SPI速度为281.25kBits/s.任何帮助,将不胜感激.

以下是我用来测试MOSI输出的部分代码

uint8_t cmd0[6]={0x40,0x00,0x00,0x00,0x00,0x95};
FATFS_CS_HIGH;
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
    for(int i=0;i<10;i++)
  {
    HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
   }

  FATFS_CS_LOW;

while(1){

      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[0], 1, 10);

      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[1], 1, 10);
      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[2], 1, 10);
      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[3], 1,10);
      HAL_SPI_Transmit(&hspi1,(uint8_t *) cmd0[4], 1, 10);
      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[5], 1, 10);

    }
Run Code Online (Sandbox Code Playgroud)

现在我发送正确的命令,我可以在范围内看到它.但是,我没有得到SD01的0x01响应(我一直得到0xff)(SanDisk Ultra 40MB/s ... 16GB)我使用下面的代码:

FATFS_CS_HIGH;
for (int i = 0; i < 10; i++) {
    HAL_SPI_Transmit(&hspi1, &dumb, 1, 10);
    while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
}

FATFS_CS_LOW; …
Run Code Online (Sandbox Code Playgroud)

c microcontroller hal spi stm32

3
推荐指数
1
解决办法
685
查看次数

Linux,Spidev:为什么它不应该直接在devicetree中?

我想定义一个具有用户模式访问权限的SPI设备,例如http://linux-sunxi.org/SPIdev中所述

在这些示例之后,我在devicetree中添加了this:

&ecspi1 {
     .... other stuff ...
    mydev@0 {
       compatible = "spidev";
       spi-max-frequency = <5000000>;
       reg = <2>; /*chipselect*/
    };
};
Run Code Online (Sandbox Code Playgroud)

该平台是i.MX6。ecspi1似乎是他们的SPI控制器。然后我确实得到了/dev/spi0.2和/sys/class/spidev/spidev0.2

但是在内核跟踪中有一个警告说:

spidev spi0.2:越野车DT:spidev直接列在DT中

那么还应该如何描述spidev?正确的语法是什么?

spi linux-device-driver device-tree

3
推荐指数
2
解决办法
1491
查看次数

树莓派 3 上的 SPI_IOC_MESSAGE(N)

我正在 Raspberry Pi 3 上开展一个项目,我看到了以下代码行:

ioctl(sSpiObj.spiFd, SPI_IOC_MESSAGE(1), &sSpiTransfer);        
Run Code Online (Sandbox Code Playgroud)

我不知道是什么SPI_IOC_MESSAGE(1),我试图在互联网上找到它的解释,但我找不到。有没有人可以解释一下它的作用?

linux ioctl spi embedded-linux raspberry-pi3

3
推荐指数
1
解决办法
6125
查看次数

面试题-如何连续读取缓冲区而不丢失数据

我是一名嵌入式工程师,经验不多。我在接受采访时被问到了一个问题,我想这并不新鲜,并且已经有了答案:

您有一个不断接收来自外部世界的输入的外设,该外设有一个缓冲区。输入的速率时不时地发生变化。外设需要读取输入缓冲区并对其进行处理。它检查输入消息并查看其是否与配置的过滤器匹配。如果匹配则转发,否则丢弃。

问题如下:

  1. 你如何处理这个问题?
  2. 如果缓冲区满了怎么办?您的缓冲区大小有限?外设仅具有一定的处理缓冲消息的速度。
  3. 如何使缓冲区适应不同的输入速度?

感谢你的帮助。谢谢。

c can-bus spi i2c embedded-linux

3
推荐指数
1
解决办法
378
查看次数