0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32的SPI单工模式主从通信介绍

jf_pJlTbmA9 来源:武汉芯源半导体 作者:武汉芯源半导体 2023-10-24 15:50 次阅读

串行外设接口(SPI)是一种同步串行数据通信接口,常用于 MCU 与外部设备之间进行同步串行通信。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间。CW32L083 内部集成 2 个串行外设 SPI 接口,支持双向全双工、单线半双工和单工通信模式,可配置 MCU 作为 主机或从机,支持多主机通信模式,支持直接内存访问(DMA)。

单工通信模式

SPI 支持单工通信模式,主机和从机通过一根单向数据线进行单发或单收通信。主机使用 MOSI 信号线进行单发通信,使用 MISO 信号线进行单收通信;从机使用 MOSI 信号线进行单收通信, 使用 MISO 信号线进行单发通信,未使用的信号线可供其它功能使用。

主机单发,从机单收应用场景下,连接框图如下:

wKgaomUDy8WAch3hAABLi9Sxd9M341.png

主机单发配置:

设置 SPIx_CR1.MODE 为 0x1,SPI 工作于单工单发通信模式;

设置 SPIx_CR1.MSTR 为 1,SPI 工作于主机模式。

设置 SPIx_SSI.SSI 为 0,在从机选择 CS 引脚输出低电平,作为通信起始信号。

当发送缓冲器为空时,即 SPIx_ISR.TXE 标志位为 1,将待发送的一帧数据写入 SPIx_DR 寄存器,数据在同步移位时钟信号的控制下从 MOSI 引脚输出。

当写入最后一帧数据后,必须等待发送缓冲空标志位 SPIx_ISR.TXE 变为 1,同时 SPI 总线忙标志位 SPIx_ISR. BUSY 变为 0,以确保数据发送完毕。然后设置 SPIx_SSI.SSI 为 1,使从机选择 CS 引脚输出高电平,结束本次通信。

从机单收配置:

设置 SPIx_CR1.MODE 为 0x2,SPI 工作于单工单收通信模式;

设置 SPIx_CR1.MSTR 为 0,SPI 工作于从机模式。

检测到 CS 引脚变为低电平时,从机开始与主机通信。当接收缓冲器非空时,即 SPIx_ISR.RXNE 标志位为 1,表示已经接收完成一帧数据,此时可以读取 SPIx_DR 寄存器。当检测到 CS 引脚变为高电平时,本次通信结束。

主机单收,从机单发应用场景下,连接框图如下:

wKgZomUDy8aAJk32AABKB2xRqQ0447.png

具体设置与主机单发和从机单收类似,详情可查看用户手册。

SPI中断

SPI 控制器支持 8 个中断源,当 SPI 中断触发事件发生时,中断标志位会被硬件置位,如果设置了对应的中断使能控制位,将产生中断请求。

wKgaomUDy8eAS1JSAACHeljokWU272.png

在用户 SPI 中断服务程序中,应查询相关 SPI 中断标志位,以进行相应的处理,在退出中断服务程序之前,要清除该中断标志位,避免重复进入中断程序。

实例演示:SPI单工模式进行主从机通信,主机单发,从机单收。

SPIy(主机)采用中断方式发送TxBuffer缓冲区中的数据,SPIz(从机)采用中断方式接收数据并存储到RxBuffer缓冲区,比较TxBuffer和RxBuffer,如果数据一致LED1亮,否则LED2亮。

1. 配置RCC

voidRCC_Configuration(void)
{
RCC_HSI_Enable(RCC_HSIOSC_DIV2);//SYSCLK=HSI=24MHz=HCLK=PCLK
RCC_AHBPeriphClk_Enable(SPIy_GPIO_CLK|SPIz_GPIO_CLK|RCC_AHB_PERIPH_GPIOC,ENABLE);//外设时钟使能
SPIy_APBClkENx(SPIy_CLK,ENABLE);
SPIz_APBClkENx(SPIz_CLK,ENABLE);
}‍

2. 配置GPIO

voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure={0};
SPIy_AF_SCK;//SPISCKMOSI复用
SPIy_AF_MOSI;
SPIz_AF_SCK;
SPIz_AF_MOSI;
GPIO_InitStructure.Pins=SPIy_SCK_PIN;//推挽输出
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Init(SPIy_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=SPIy_MOSI_PIN;
GPIO_Init(SPIy_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=SPIz_SCK_PIN;//浮空输入
GPIO_InitStructure.Mode=GPIO_MODE_INPUT;
GPIO_Init(SPIz_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=SPIz_MOSI_PIN;
GPIO_Init(SPIz_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=GPIO_PIN_3|GPIO_PIN_2;//PC3LED1/PC2LED2
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Init(CW_GPIOC, GPIO_InitStructure);
PC03_SETLOW();//LED灭
PC02_SETLOW();
}‍

3. 配置SPI

voidSPI_Configuration()
{
SPI_InitTypeDefSPI_InitStructure={0};
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_TxOnly;//单工单发
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//主机模式
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//帧数据长度为8bit
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;//时钟空闲电平为低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//第一个边沿采样
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//片选信号由SSI寄存器控制
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;//波特率为PCLK的8分频
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//最高有效位MSB收发在前
SPI_InitStructure.SPI_Speed=SPI_Speed_Low;//低速SPI
SPI_Init(SPIy, SPI_InitStructure);
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_RxOnly;//单工单收
SPI_InitStructure.SPI_Mode=SPI_Mode_Slave;//从机模式
SPI_Init(SPIz, SPI_InitStructure);
SPI_Cmd(SPIy,ENABLE);
SPI_Cmd(SPIz,ENABLE);
}‍

4. 配置NVIC中断函数

voidNVIC_Configuration(void)
{
NVIC_SetPriority(SPIy_IRQ,1);//优先级,无优先级分组
NVIC_SetPriority(SPIz_IRQ,0);
NVIC_EnableIRQ(SPIy_IRQ);//SPI中断使能
NVIC_EnableIRQ(SPIz_IRQ);
}
voidSPI1_IRQHandler(void)//SPI1中断函数
{
if(SPI_GetITStatus(CW_SPI1,SPI_IT_TXE)!=RESET)
{
if(TxCounter==BufferSize-1)
{
SPI_ITConfig(CW_SPI1,SPI_IT_TXE,DISABLE);
}
SPI_SendData(CW_SPI1,TxBuffer[TxCounter++]);
}
}
voidSPI2_IRQHandler(void)//SPI2中断函数
{
if(SPI_GetITStatus(CW_SPI2,SPI_IT_RXNE)!=RESET)
{
RxBuffer[RxCounter++]=SPI_ReceiveData(CW_SPI2);
}
}‍

5. 比较两个buffers区

TestStatusBuffercmp(uint8_t*pBuffer1,uint8_t*pBuffer2,uint16_tBufferLength)
{
while(BufferLength--)
{
if(*pBuffer1!=*pBuffer2)
{
returnFAILED;
}
pBuffer1++;
pBuffer2++;
}
returnPASSED;
}‍

6. 主程序

int32_tmain(void)
{
RCC_Configuration();//配置RCC
GPIO_Configuration();//配置GPIO
SPI_Configuration();//配置SPI
NVIC_Configuration();//配置NVIC

SPI_ITConfig(SPIz,SPI_IT_RXNE,ENABLE);//使能SPIzRXNE中断
SPI_NSSInternalSoftwareConfig(SPIz,SPI_NSSInternalSoft_Reset);//软件NSS,选中SPIz
SPI_ITConfig(SPIy,SPI_IT_TXE,ENABLE);//使能SPIyTXE中断
while(RxCounter< BufferSize); //等待收发完成
    SPI_NSSInternalSoftwareConfig(SPIz, SPI_NSSInternalSoft_Set); //释放SPIz
    TransferStatus = Buffercmp(TxBuffer, RxBuffer, BufferSize); //检查收发数据一致性
    if(TransferStatus == PASSED) //PASSED
    {
        PC03_SETHIGH();//LED1亮
    }

    else //FAILED
    {
        PC02_SETHIGH();//LED2亮
    }
    while(1)
    {
    }
}‍

7.实验结果显示:LED1亮起,buffers区数据相等,SPI单工模式主从通讯(中断方式)功能实现。

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350992
  • 通信
    +关注

    关注

    18

    文章

    6024

    浏览量

    135950
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91507
收藏 人收藏

    评论

    相关推荐

    CW32移植Free-RTOS】CW32开发者扶持计划

    CW32配置Free-RTOS全过程,CW32开发者扶持计划
    的头像 发表于 04-18 09:38 6138次阅读
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>开发者扶持计划

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 1949次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    CW32开发者扶持计划#CW32 #芯片

    CW32
    CW32生态社区
    发布于 :2023年05月24日 16:56:14

    【应用笔记】CW32 自举程序中使用的 ISP 协议

    提供的 ISP 模式,通过 UART 串口方便地实现对 CW32 微控制器片上 FLASH主存储器的擦除和烧写。本应用笔记将介绍如何进入 CW32 微控制器 ISP
    发表于 06-06 13:26

    AT32F4xx SPI使用工模式通讯

    AT32F4xx SPI使用工模式通讯演示AT32F403Axx SPI使用工模式通讯,其余
    发表于 10-27 06:14

    CW32单片机在智能马桶的应用介绍

    和调节。本文将介绍CW32单片机在智能马桶的详细应用。 图:CW32的智能马桶控制板 CW32单片机在智能马桶的应用介绍 1.温度感应与控
    发表于 12-20 10:06

    STM32_ SPI主从通信

    STM32_SPI主从通信
    的头像 发表于 04-08 10:54 7609次阅读
    STM32_ <b class='flag-5'>SPI</b><b class='flag-5'>主从</b><b class='flag-5'>通信</b>

    CW32 低功耗模式的特性介绍

    CW32系列芯片支持3种工作模式,运行模式、休眠模式以及深度休眠模式,本文以CW32L083为例
    的头像 发表于 12-30 10:53 1138次阅读
    <b class='flag-5'>CW32</b> 低功耗<b class='flag-5'>模式</b>的特性<b class='flag-5'>介绍</b>

    cw32和stm32的区别

    cw32和stm32的区别 CW32和STM32是两种常见的单片机,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机
    的头像 发表于 08-16 11:15 4178次阅读

    cw32和gd32的区别

    cw32和gd32的区别 CW32和GD32是两种不同的芯片系列,分别由WCH和GigaDevice公司推出,两者有很多不同之处,下面我们来详细介绍。 首先从CW32系列开始,
    的头像 发表于 08-16 11:15 1961次阅读

    CW32L083的UART单线半双工模式介绍

    CW32L083的UART单线半双工模式介绍
    的头像 发表于 10-24 17:49 1210次阅读
    <b class='flag-5'>CW</b>32L083的UART单线半双<b class='flag-5'>工模式</b><b class='flag-5'>介绍</b>

    CW32 PWM输出功能介绍

    CW32 PWM输出功能介绍
    的头像 发表于 09-27 16:12 826次阅读
    <b class='flag-5'>CW32</b> PWM输出功能<b class='flag-5'>介绍</b>

    CW32实时时钟(RTC)介绍

    CW32实时时钟(RTC)介绍
    的头像 发表于 10-24 15:36 1140次阅读
    <b class='flag-5'>CW32</b>实时时钟(RTC)<b class='flag-5'>介绍</b>

    应用笔记-CW32 自举程序中使用的 ISP 协议

    ,通过UART串口方便地实现对CW32微控制器片上FLASH主存储器的擦除和烧写。本应用笔记将介绍如何进入CW32微控制器ISP模式,以及所使用的ISP协议,并详细
    发表于 06-06 13:37 7次下载

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 786次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用