S322G274A 配置spi从机slave和spi中断

1.新增pins

在这里插入图片描述

在这里插入图片描述

2.检查时钟

在这里插入图片描述

3.添加DMA配置

在这里插入图片描述

  • 配置Tx DMA通道

在这里插入图片描述

  • 配置CMD DMA通道

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 配置Rx DMA通道

在这里插入图片描述

4.添加SPI设备

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.添加中断

  • 允许中断,设置优先级

在这里插入图片描述

  • 中断回调函数

在这里插入图片描述

7.初始化和中断代码

//  初始化
void SPI1_Init()
{
	/* Initialize each Spi hardware units using*/
	Spi_Ip_Init(&Spi_Ip_PhyUnitConfig_SpiPhyUnit_1_VS_0);
	/* Update Framesize */
	Spi_Ip_UpdateFrameSize(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, 8U);
	/* Update Transfered Bit order */
	Spi_Ip_UpdateLsb(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, FALSE);
	/* Update Transfer Mode */
	Spi_Ip_UpdateTransferMode(Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0.Instance, SPI_IP_INTERRUPT);
}

//  中断回调函数
void Spi1_Ipw_Callback()
{
	memcpy(rxmsg.buff,RxPtr,21);	//	接收到数据
    //  处理接收的数据
    memcpy(TxPtr,SPI_Tx_msgbuff,21);
    Spi_Ip_AsyncTransmit(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, TxPtr, RxPtr, SPI_TxRx_Length, &Spi1_Ipw_Callback);
}

//  首次发送, 从机配置时, 要一开始先调用一次发送, 这样s32g才会等待主机CS并触发中断
void App_Spi1_SendFirst()
{
    App_SPI_data_init();
    TxPtr = (uint8 *)malloc(21);
	RxPtr = (uint8 *)malloc(21);
    memcpy(TxPtr,SPI_Tx_msgbuff,21);
    memcpy(RxPtr,Rx_SPI_Buffer,21);
    Spi_Ip_AsyncTransmit(&Spi_Ip_DeviceAttributes_SpiExternalDevice_1_VS_0, TxPtr, RxPtr, SPI_TxRx_Length, &Spi1_Ipw_Callback);
}

注意

const Spi_Ip_ConfigType Spi_Ip_PhyUnitConfig_SpiPhyUnit_1_VS_0 = 
{
    1U,  /* Instance */
    //  ......
};
  • 文件Spi_Ip_VS_0_PBcfg.c这里, 设备号可能需要手动改, 目前还不清楚外设中哪一个是改这个的, 如果有大佬知道麻烦评论告知🤗🤗;

  • 之前使用了spi3和spi1, 结果两个Spi_Ip_PhyUnitConfig_SpiPhyUnit_1_VS_0的这个值都是3, 运行进入了DEV_ASSERT.c, 改了这个值才正常运行,

  • 每次生成可能会覆盖, 要手动改一下

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32上,SPI从机接收中断的实现需要注意以下几点: 1. 配置SPI从机的GPIO口和SPI口,使其能够正确地接收主机的SPI数据。 2. 在NVIC中使能SPI从机中断。 3. 实现SPI从机中断服务函数,并在其中处理接收到的数据。 下面是一个基本的SPI从机接收中断的代码示例: ```c #include "stm32f10x.h" #define SPI_SLAVE_SELECT_PIN GPIO_Pin_4 #define SPI_SLAVE_SELECT_PORT GPIOA uint8_t spi_rx_buffer[10]; uint8_t spi_rx_index = 0; void SPI1_IRQHandler(void) { if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_RXNE) == SET) { spi_rx_buffer[spi_rx_index++] = SPI_I2S_ReceiveData(SPI1); // 处理接收到的数据 if (spi_rx_index >= sizeof(spi_rx_buffer)) { spi_rx_index = 0; } } } void spi_slave_init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 配置SPI口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; 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_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); // 配置SPI从机的GPIO口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = SPI_SLAVE_SELECT_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(SPI_SLAVE_SELECT_PORT, &GPIO_InitStructure); // 配置SPI从机中断 NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); SPI_Cmd(SPI1, ENABLE); } int main(void) { spi_slave_init(); while (1) { // 等待中断处理接收到的数据 } } ``` 在上述代码中,我们首先配置SPI口和从机的GPIO口,然后使能了SPI从机接收中断,并实现了中断服务函数,在其中处理接收到的数据。在主函数中,我们不断等待中断处理接收到的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值