【MCU】SPI通讯一段时间后失效

问题描述:

MCU使用spi通信与另一个芯片通讯,初始化后,能够正常通信一段时间
如果通讯次数过多,或在程序中加入过大的延时,后续通讯全部无效

解决方法:芯片是低电平复位,但误以为是高电平复位

在初始化函数中,错误的对芯片拉高一段时间后拉低
刚拉低后,芯片仍正常工作,当低电平持续时间达到芯片的复位时间,芯片一直处于复位状态,导致无法通讯

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是MCU与FPGA之间使用SPI通信的代码示例(以STM32为例): ```c #include "stm32f4xx.h" #define SPIx SPI1 #define SPIx_CLK RCC_APB2Periph_SPI1 #define SPIx_CLK_INIT RCC_APB2PeriphClockCmd #define SPIx_SCK_PIN GPIO_Pin_5 #define SPIx_SCK_GPIO_PORT GPIOA #define SPIx_SCK_GPIO_CLK RCC_AHB1Periph_GPIOA #define SPIx_SCK_SOURCE GPIO_PinSource5 #define SPIx_SCK_AF GPIO_AF_SPI1 #define SPIx_MISO_PIN GPIO_Pin_6 #define SPIx_MISO_GPIO_PORT GPIOA #define SPIx_MISO_GPIO_CLK RCC_AHB1Periph_GPIOA #define SPIx_MISO_SOURCE GPIO_PinSource6 #define SPIx_MISO_AF GPIO_AF_SPI1 #define SPIx_MOSI_PIN GPIO_Pin_7 #define SPIx_MOSI_GPIO_PORT GPIOA #define SPIx_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOA #define SPIx_MOSI_SOURCE GPIO_PinSource7 #define SPIx_MOSI_AF GPIO_AF_SPI1 #define SPI_CS_PIN GPIO_Pin_4 #define SPI_CS_GPIO_PORT GPIOA #define SPI_CS_GPIO_CLK RCC_AHB1Periph_GPIOA #define SPIx_DMA DMA2 #define SPIx_DMA_CLK RCC_AHB1Periph_DMA2 uint8_t data_to_send = 0x55; uint8_t received_data = 0; void SPI_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* Enable GPIO clocks */ RCC_AHB1PeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MISO_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE); /* Enable SPI clock */ SPIx_CLK_INIT(SPIx_CLK, ENABLE); /* Configure SPI pins */ GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN | SPIx_MISO_PIN | SPIx_MOSI_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Connect SPI pins to AF */ GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF); GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF); GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF); /* Configure SPI */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPIx, &SPI_InitStructure); /* Enable SPI */ SPI_Cmd(SPIx, ENABLE); } void SPI_CS_Enable(void) { GPIO_ResetBits(SPI_CS_GPIO_PORT, SPI_CS_PIN); } void SPI_CS_Disable(void) { GPIO_SetBits(SPI_CS_GPIO_PORT, SPI_CS_PIN); } void SPI_SendData(uint8_t data) { while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPIx, data); } uint8_t SPI_ReceiveData(void) { while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(SPIx); } void SPI_SendByte(uint8_t byte) { /* Enable CS */ SPI_CS_Enable(); /* Send byte */ SPI_SendData(byte); /* Disable CS */ SPI_CS_Disable(); } uint8_t SPI_ReceiveByte(void) { uint8_t byte; /* Enable CS */ SPI_CS_Enable(); /* Receive byte */ byte = SPI_ReceiveData(); /* Disable CS */ SPI_CS_Disable(); return byte; } int main(void) { /* Initialize SPI */ SPI_Configuration(); /* Initialize CS pin */ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(SPI_CS_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = SPI_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(SPI_CS_GPIO_PORT, &GPIO_InitStructure); /* Send and receive data */ received_data = SPI_ReceiveByte(); SPI_SendByte(data_to_send); while (1) { } } ``` 上述代码中,`SPI_Configuration`函数用于初始化SPI,`SPI_CS_Enable`和`SPI_CS_Disable`函数用于使能和禁用从设备的CS信号,`SPI_SendData`和`SPI_ReceiveData`函数用于发送和接收数据,`SPI_SendByte`和`SPI_ReceiveByte`函数用于发送和接收单个字节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值