STM32 & TLV5628 SPI 通信

     2023-02-19     204

关键词:

【中文标题】STM32 & TLV5628 SPI 通信【英文标题】:STM32 & TLV5628 SPI Communication 【发布时间】:2019-06-14 08:38:36 【问题描述】:

大家好,感谢您的宝贵时间。

我一直致力于将STM32f446RE Nucleo 板与TLV5628 8 位八进制串行DAC 连接起来。我遇到了多个问题,但当前的问题是以下两件事之一:

1) 显示完全相同信息的数据线和时钟线

2) 数据线显示信息,但时钟线上没有。

无论如何,出来的信息是完全不正确的。

这是我的设置代码:

void SPI_INIT(void)
// Enable clocks for C
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;

    // SPI GPIO
    GPIOC->MODER |= 2 << 3*2; // PC3 data pin
    GPIOC->MODER |= 2 << 7*2; // PC7 clock pin
    GPIOC->MODER |= 1 << 2*2; //pc2 load
    GPIOC->MODER |= 1 << 4*2; //pc4 ldac - probably set low permanently
    // Pins default to push-pull
    // set all to high speed
    GPIOC->OSPEEDR |= (3 << 2*2) | (3 << 3*2) | (3 << 4*2) | (3 << 7*2);
    GPIOC->AFR[0] |= 5<< 6*2; // Alt func 5 pc3 - SPI2
    GPIOC->AFR[0] |= 5 << 7*2; // Alt func 5 pc7 - SPI2
    // SPI Setup
    RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; // Enable SPI Clock
    RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST; // reset SPI2
    RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;// clear the reset

    // Control Register 1
    SPI2->CR1 &= ~SPI_CR1_SPE; // Disable SPI
    SPI2->CR1 |= SPI_CR1_MSTR; // master mode
    SPI2->CR1 &= ~SPI_CR1_RXONLY; // transmit, 0 == full duplex
    SPI2->CR1 &= ~SPI_CR1_DFF; // 8 bit format
    SPI2->CR1 &= ~SPI_CR1_LSBFIRST; // MSB first
    SPI2->CR1 &= ~SPI_CR1_CPOL;// low polarity, so 0 when idle
    SPI2->CR1 |=   4 << 3; // (180M/4)/32 = 1.41 MHz
    SPI2->CR1 |= SPI_CR1_CPHA; // first edge, look in data sheet
    //Questionable settings
    // Biderectional data line
    SPI2->CR1 |= SPI_CR1_BIDIMODE; // 1/17/2019 --> Check to see if this fixes something

    SPI2->CR1 |= SPI_CR1_BIDIOE; // idk if i need this
    //  CRC Polynomial Register
    SPI2->CRCPR = 10;

    // Control Register 2
    SPI2->CR2 |= 1<<2; // SS output enabled

    SPI2->CR1 |= SPI_CR1_SPE; // enable, has to be last

这是我的 SPI 写代码:

void SPI_Write(int dacSelect, int adcData)

    while((SPI2->SR & SPI_SR_TXE) != 0);
    GPIOC->ODR |= 1 << 2; // load set high to read data
    SPI2->DR = dacArray[dacSelect]; // send address
    SPI2->DR = adcData; // send adc data
  while((SPI2->SR & SPI_SR_BSY) == SPI_SR_BSY);
    GPIOC->ODR &= ~(1 << 2); // Send load low to load data
    Delay(10); // short delay
    GPIOC->ODR |= 1 << 2;

【问题讨论】:

【参考方案1】:

您可以使用 STMCubeMX 为 STM 微处理器和电路板生成代码。以下代码块是从 STM32ubeMX 为 STM32F4 生成的。您应该更改传感器的波特率。

SPI_HandleTypeDef hspi;
SPI_HandleTypeDef SpiHandle;

void Spi_Initialize(void)

    /*##-1- Configure the SPI peripheral #######################################*/
    /* Set the SPI parameters */
    SpiHandle.Instance               = SPI2;
    SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
    SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
    SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
    SpiHandle.Init.CLKPolarity       = SPI_POLARITY_LOW;
    SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
    SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
    SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
    SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
    SpiHandle.Init.CRCPolynomial     = 7;
    SpiHandle.Init.NSS               = SPI_NSS_SOFT;
    SpiHandle.Init.Mode              = SPI_MODE_MASTER;

    if(HAL_SPI_Init(&SpiHandle) != HAL_OK)
    
        while(1);
    


void Spi_Read(void )

    uint8_t SpiData[2];
    uint8_t tempmessage = 8;

    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_8,RESET); // CS pin

    HAL_SPI_TransmitReceive(&hspi,&tempmessage,SpiData,2,5000); // Read Data

    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_8,SET); // CS Pin


void Spi_Write(uint8_t *Data, uint8_t size)
   
    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_8,RESET); // CS pin

    HAL_SPI_Transmit(&hspi, Data, size, 5000); // Write Data

    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_8,SET); // CS Pin

【讨论】:

学习7__stm32--spi外设之双机通信---

<target>  >整透stm32之spi双机通信(包括双机同为stm32,stm32&others) <筹备> <概念> <key> <细节> <注意> <总结>  查看详情

stm32与fpga进行spi通信(代码片段)

一、器件32单片机:STM32F407ZGFPGA   :EP4CE6E22C8N二、通信方式STM32作为主机(软件);FPGA作为从机;SPI通信方式为0;三、STM32源代码1#include"delay.h"2#include"stm32f4xx.h"34#ifndef__SPI_H5#define__SPI_H67#defineSPI1_SCKPBout(2)8#defineSPI1_MOSIPBout(3)9#... 查看详情

STM32 SPI通讯

】STM32SPI通讯【英文标题】:STM32SPIcommunication【发布时间】:2019-04-0622:56:21【问题描述】:我正在尝试使用STM32F411VE进行SPI通信。我在SPI通信方面遇到了一些问题。我正在关注这个特定代码的传输和接收http://www.handsonembedded.com/stm3... 查看详情

stm32h7的spi总线基础知识和hal库api(代码片段)

...rmbbs.cn/forum.php?mod=viewthread&tid=86980第72章      STM32H7的SPI总线基础知识和HAL库API本章节为大家讲解SPI(Serialperipheralinterface)总线的基础知识和对应的HAL库API。目录第72章      STM32H7的SPI总线基础知识和HAL库API... 查看详情

stm32 spi全双工从机模式

】stm32spi全双工从机模式【英文标题】:stm32spifull-duplexslavemode【发布时间】:2019-12-0818:03:20【问题描述】:我正在研究stm32f0308-discovery和jetsontx2之间的spi通信。Jetson是主人,stm32应该是奴隶。(我知道怎么做,但如果可能的话stm32... 查看详情

stm32f103(二十六)spi通信(+两块stm32之间的spi通信)

学习板:STM32F103ZET6往期博客:STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置STM32F103五分钟入门系列(三)GPIO的常用库函数使用方法... 查看详情

stm32-------spi通信

...​​SPI特点​​​​SPI物理层​​​​SPI协议层​​​​STM32的SPI特性及架构​​​​设计实现​​​​后续​​引言在万物互联时代,“通信”对物联网尤为重要。在单片机或嵌入式开发领域,几乎很少有一个硬件单独就能实... 查看详情

stm32cubemx使用之dma使用spi

...图,可以看到实际使用的管脚与默认不符:回到STM32Cube中,直接在使用的管脚上选择模式即可。根据需要命名管脚:设置SPI参数:2.2开启DMA中断进入DMA外设,添加DMA设置:这里需要设置两个通道:... 查看详情

STM32 SPI 慢速计算

】STM32SPI慢速计算【英文标题】:STM32SPISlowCompute【发布时间】:2019-10-1918:50:39【问题描述】:我正在使用STM32F4及其SPI与本教程中的74HC595通信。区别在于初学者我使用非DMA版本为简单起见。我用STMCubeMX配置SPI和GPIO问题是:我没有... 查看详情

stm32-spi

             7 查看详情

stm32f103(二十六)spi通信(+两块stm32之间的spi通信)

学习板:STM32F103ZET6往期博客:STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置STM32F103五分钟入门系列(三)GPIO的常用库函数使用方法... 查看详情

STM32主/从SPI通信使用HAL_SPI_TransmitReceive()

】STM32主/从SPI通信使用HAL_SPI_TransmitReceive()【英文标题】:STM32Master/SlaveSPIcommunicationusingHAL_SPI_TransmitReceive()【发布时间】:2021-11-2201:48:37【问题描述】:我正在尝试使用HAL_SPI_TransmitReceive()测试SPI主机,因为我将与SPI从机进行通信... 查看详情

STM32 HAL SPI 16 位发送

】STM32HALSPI16位发送【英文标题】:STM32HALSPI16bitTransmit【发布时间】:2018-02-0121:51:08【问题描述】:我正在尝试使用HAL_SPI_Transmit(.)进行16位数据传输。我已经将使用STM32Cube的SPI配置为16位数据大小(与hspi2.Init.DataSize=SPI_DATASIZE_16BIT... 查看详情

stm32学习笔记(15)——spi协议(代码片段)

STM32学习笔记(15)——SPI协议一、SPI协议简介1.物理层2.协议层(1)通讯的开始与停止(2)时钟极性CPOL、时钟相位CPHA二、STM32的SPI外设1.通讯引脚2.时钟控制逻辑3.数据控制逻辑4.整体控制逻辑5.STM32的SPI通... 查看详情

利用stm32cubemx之spi

现在我们继续使用STM32CubeMX来生成SPI工程。我们的硬件平台还是我们熟悉的STM32F103C8开发板。设置时钟树中的配置 现在打开SPI的设置如果想修改管脚的名字可以红色框中进行修改,修改后在生成代码将其来宏定义 现在来... 查看详情

STM32F4 SPI1 工作,SPI5 不工作?

】STM32F4SPI1工作,SPI5不工作?【英文标题】:STM32F4SPI1working,SPI5notworking?【发布时间】:2017-09-2306:36:23【问题描述】:我有一个STM32Nucleo-F410RB开发板,并且能够让我的外部DAC与SPI1一起工作,包括忙等待和DMA。然后,我设计了自己... 查看详情

STM32 SPI 与 HAL 通信

】STM32SPI与HAL通信【英文标题】:STM32SPIcommunicationwithHAL【发布时间】:2021-08-2713:34:29【问题描述】:我刚开始对STM32进行编程,并使用CubeMX生成了一个代码,用于与陀螺仪(L3GD20)进行SPI通信我对HAL_SPI命令有疑问。我首先尝试读取... 查看详情

STM32 SPI数据打包

】STM32SPI数据打包【英文标题】:STM32SPIDataPacking【发布时间】:2022-01-0203:04:56【问题描述】:我无法在我的STM32f3发现板上获取SPI(Datasheet)与陀螺仪传感器一起使用(I3G4250D)在寄存器级别。我知道我正在发送数据,因为我处于全... 查看详情