首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SPI将16位数组从Raspberry Pi传输到STM32F4

使用SPI将16位数组从Raspberry Pi传输到STM32F4
EN

Stack Overflow用户
提问于 2021-03-03 11:05:14
回答 1查看 502关注 0票数 0

关于我的最终目标,我有两个主要问题,即能够从从属模式下的STM32F4向主模式下的覆盆子pi发送一个大小为2000的16位数组。

问题1.我不明白为什么从STM发送时,我会在Pi上读取/打印不正确的输出。我已经解释了我的编程和结果输出。

最初,我正在测试传输一个8位整数,因为HAL_SPI_Transmit函数原型只允许8位传输(这是我的问题2),所以我现在设置了8位传输,但我的8位传输不正确。使用CubeMX将我的STM32F4配置为8位从机模式,这将生成以下代码块。

代码语言:javascript
运行
复制
static void MX_SPI2_Init(void)
{

/* SPI2 parameter configuration*/
hspi2.Instance = SPI2;

hspi2.Init.Mode = SPI_MODE_SLAVE;

hspi2.Init.Direction = SPI_DIRECTION_1LINE;

hspi2.Init.DataSize = SPI_DATASIZE_8BIT;

hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;

hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;

hspi2.Init.NSS = SPI_NSS_SOFT;

hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;

hspi2.Init.TIMode = SPI_TIMODE_DISABLE;

hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

hspi2.Init.CRCPolynomial = 10;

if (HAL_SPI_Init(&hspi2) != HAL_OK)

{

Error_Handler();

}


}

通过使用HAL库,我当前设置为使用HAL_SPI_Transmit函数传输一个8位数组(数组spiDATA的类型为uint8_t),如以下代码段所示。在接下来的段落中,我只是尝试发送数组spiDATA的第一个条目。

代码语言:javascript
运行
复制
while (1)

{

  spiDATA[0]=5;

  spiDATA[1]=7;

  HAL_SPI_Transmit(&hspi2, spiDATA, 1, 10);

 }

现在来看一下Pi,在STM上接收数据的代码如下所示

代码语言:javascript
运行
复制
#initialise spiDEV

spi = spidev.SpiDev()

spi.open(0,0)

spi.max_speed_hz = 100000

TRUE = 1

while TRUE:

y = spi.readbytes(1)

print("Value tranferred by SPI is", y[0])

time.sleep(1)

现在,当运行此命令时,pi上的输出如下所示

代码语言:javascript
运行
复制
("Value tranferred by SPI is", 80)

("Value tranferred by SPI is", 65)

("Value tranferred by SPI is", 5)

("Value tranferred by SPI is", 10) 

("Value tranferred by SPI is", 20)

("Value tranferred by SPI is", 40)

("Value tranferred by SPI is", 80)

("Value tranferred by SPI is", 65)

("Value tranferred by SPI is", 5)

("Value tranferred by SPI is", 10)

如果我将HAL_SPI_Transmit更改为发送2字节,将readbytes更改为2字节,并同时打印y和y1,则会将相同的内容打印两次,例如,如下所示

代码语言:javascript
运行
复制
("Value tranferred by SPI is", 80, 80)

("Value tranferred by SPI is", 65, 65)

("Value tranferred by SPI is", 5, 5)

etc    

现在,如果我将HAL_SPI_Transmit更改为传输4个字节,将readbytes更改为2个字节,则会得到以下结果:

代码语言:javascript
运行
复制
("Value tranferred by SPI is", 5, 7)

("Value tranferred by SPI is", 0, 20)

("Value tranferred by SPI is", 56, 40)

("Value tranferred by SPI is", 112, 80)

("Value tranferred by SPI is", 224, 160)

("Value tranferred by SPI is", 193, 65)

("Value tranferred by SPI is", 130, 112)

("Value tranferred by SPI is", 5, 7)

问题2:是否可以使用HAL_SPI_Transmit函数发送16位?在HAL_SPI_Transmit函数原型中,它表示需要一个指向数据的8位指针,如下所示。

代码语言:javascript
运行
复制
HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

我已经使用cubeMX为16位传输重新配置了我的pin,

代码语言:javascript
运行
复制
hspi2.Init.DataSize = SPI_DATASIZE_16BIT;

但我仍然有一个问题,当我尝试发送16位时,当通过SPI与Pi通信时,它会将16位整数截断为8位整数。我已经在其他地方的论坛上看到过这个帖子,建议的答案是在原型中键入*pdata,例如我的函数将在HAL_SPI_Transmit中更改为(uint8_t*)spiData‘。这不起作用,因为我需要11到12位来表示我范围内的整数,它们的值类似于'2000‘和'3000’等。通过类型转换,我丢失了这些信息,因为它正在截断这些位。

EN

回答 1

Stack Overflow用户

发布于 2021-03-05 23:40:22

SPI传输错误可能由许多问题引起。

  • 您需要确保您的内核时钟有足够高的来处理数据接收。如果您的SPI时钟频率总线低于树莓派Spi波特率。
  • 从SPI演示文稿:用户可以防止任何相关输出上的任何毛刺工作在备用功能模式下的保持它们在控制下强制。这意味着您需要在下拉电阻(或上拉)上配置和强制您的GPIO、MOSI、NSS。
  • 在您的树莓派中使用stm32 GPIO CS中的硬件NSS (禁用无CS)。
  • 尝试发送较长大小的缓冲区(例如: 256)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66450189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档