【经验】解析武汉芯源MCU CW32L083的SPI单工模式主从通信
本文中武汉芯源将为大家介绍MCU CW32L083的SPI单工模式主从通信。
串行外设接口(SPI)是一种同步串行数据通信接口,常用于MCU与外部设备之间进行同步串行通信。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间。CW32L083内部集成2个串行外设SPI接口,支持双向全双工、单线半双工和单工通信模式,可配置MCU作为主机或从机,支持多主机通信模式,支持直接内存访问(DMA)。
单工通信模式
SPI支持单工通信模式,主机和从机通过一根单向数据线进行单发或单收通信。主机使用MOSI信号线进行单发通信,使用MISO信号线进行单收通信;从机使用MOSI信号线进行单收通信, 使用MISO信号线进行单发通信,未使用的信号线可供其它功能使用。
主机单发,从机单收应用场景下,连接框图如下:
主机单发配置:
设置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引脚变为高电平时,本次通信结束。
主机单收,从机单发应用场景下,连接框图如下:
具体设置与主机单发和从机单收类似,详情可查看用户手册。
SPI中断
SPI控制器支持8个中断源,当SPI中断触发事件发生时,中断标志位会被硬件置位,如果设置了对应的中断使能控制位,将产生中断请求。
在用户SPI中断服务程序中,应查询相关SPI中断标志位,以进行相应的处理,在退出中断服务程序之前,要清除该中断标志位,避免重复进入中断程序。
实例演示: SPI单工模式进行主从机通信,主机单发,从机单收。
SPIy(主机)采用中断方式发送TxBuffer缓冲区中的数据,SPIz(从机)采用中断方式接收数据并存储到RxBuffer缓冲区,比较TxBuffer和RxBuffer,如果数据一致LED1亮,否则LED2亮。
1. 配置RCC
void RCC_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
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure={0};
SPIy_AF_SCK; //SPI SCK MOSI 复用
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; //PC3 LED1 / PC2 LED2
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
PC03_SETLOW();//LED灭
PC02_SETLOW();
}
3. 配置SPI
void SPI_Configuration()
{
SPI_InitTypeDef SPI_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中断函数
void NVIC_Configuration(void)
{
NVIC_SetPriority(SPIy_IRQ, 1); //优先级,无优先级分组
NVIC_SetPriority(SPIz_IRQ, 0);
NVIC_EnableIRQ(SPIy_IRQ); //SPI中断使能
NVIC_EnableIRQ(SPIz_IRQ);
}
void SPI1_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++]);
}
}
void SPI2_IRQHandler(void) //SPI2中断函数
{
if(SPI_GetITStatus(CW_SPI2, SPI_IT_RXNE) != RESET)
{
RxBuffer[RxCounter++] = SPI_ReceiveData(CW_SPI2);
}
}
5. 比较两个buffers区
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
while(BufferLength--)
{
if(*pBuffer1 != *pBuffer2)
{
return FAILED;
}
pBuffer1++;
pBuffer2++;
}
return PASSED;
}
6. 主程序
int32_t main(void)
{
RCC_Configuration();//配置RCC
GPIO_Configuration();//配置GPIO
SPI_Configuration();//配置SPI
NVIC_Configuration();//配置NVIC
SPI_ITConfig(SPIz, SPI_IT_RXNE, ENABLE); //使能 SPIz RXNE 中断
SPI_NSSInternalSoftwareConfig(SPIz, SPI_NSSInternalSoft_Reset); //软件NSS,选中SPIz
SPI_ITConfig(SPIy, SPI_IT_TXE, ENABLE); //使能 SPIy TXE 中断
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单工模式主从通讯(中断方式)功能实现。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由犀牛先生转载自武汉芯源半导体公众号,原文标题为:CW32的SPI单工模式主从通信介绍,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
武汉芯源半导体安全低功耗MCU CW32L010 | 新品使用初体验
CW32L010新品的正式发布,标志着嵌入式技术领域的又一次创新突破。今日,我们有幸进行该新品的首次使用体验,以一块L010核心板为例,体验一下这颗芯片
【经验】芯源CW32系列单片机低功耗模式介绍及UART深度休眠模式示例
CW32单片机低功耗模式介绍及UART深度休眠模式示例。
【经验】武汉芯源CW32系列MCU PWM输出功能指南
脉冲宽度调制(PWM),是在数字电路中达到模拟输出效果的一种手段,常见应用电机调速,照明灯调光等。在MCU中,主要通过定时器单元来时实现PWM输出,以CW32L083VxTx为例,LPTIM,GTIM,ATIM都可以输出PWM信号。
武汉芯源半导体CW32L010系列安全低功耗MCU:驱动高速风筒新力量
MCU作为高速风简控制系统的核心,承担着传感器数据采集、高速电机控制、用户界面交互以及安全保护等多重任务。武汉芯源半导体CW32L010系列MCU可支持低成本、高性能、低功耗、高度集成的高速风筒方案,以满足市场对高效、安全、智能的高速风筒需求。
【应用】基于国产32位MCU芯片CW32F030C8T6的智能门锁方案,主频64MHz,具备低功耗多功能优势
智能门锁集成3D识别算法、接近检测、指纹输入模块,低功耗计算芯片等于一体,解锁快、功耗低、续航久,现武汉芯源推出一款MCU芯片CW32F030C8T6助力于智能门锁设计。
CW32L010 ARM®Cortex®-M0+32位低功耗MCU,高达64KB闪存、4KB RAM规格书
描述- 本资料为Wuhan Xinyuan Semiconductor Co., Ltd.生产的CW32L010微控制器的数据手册。该微控制器基于ARM® Cortex®-M0+内核,具有低功耗特性,最高频率可达48 MHz。它集成了高达64KB的闪存、4KB的RAM,支持多种外设和通信接口,适用于各种低功耗应用。
型号- CW32L010,CW32L010F8,CW32L010F8P6,CW32L010F8U6,CW32L010F8U6X,CW32L010Y8M6,CW32L010Y8,CW32L010X8
【IC】武汉芯源CW32L010安全低功耗MCU,树立M0+产品行业新标杆!
近日,武汉芯源半导体CW32L010系列产品正式官方发布。这款产品以其卓越的产品性能,迅速在业界引起了广泛关注,并成功树立M0+产品行业的新标杆。产品是基于eFlash的单芯片低功耗微控制器,集成了主频高达48MHz的ARM®Cortex®-M0+内核、高速嵌入式存储器(多至64K字节FLASH和多至4K字节SRAM)以及一系列全面的增强型外设和I/O口。
【应用】基于CW32L系列MCU的指夹式血氧仪,实现更高精度测量
主控芯片建议使用CW32F003(20pin)资源足够,还便宜。CW32抗干扰性能可轻松通过ESD 8KV认证,加之优秀的ADC性能,是血氧仪类产品的不二之选
CW32L010 ARM®Cortex®-M0+低功耗32位MCU参考手册
描述- 本资料为CW32L010微控制器参考手册,旨在为应用开发者提供关于如何使用该微控制器内存和外设的完整信息。手册内容涵盖系统架构、内存组织、电源控制、复位和时钟控制、中断、RAM和FLASH内存、GPIO、CRC、RTC、定时器、看门狗定时器、UART、SPI、I2C、红外调制发射器、ADC、电压比较器、低压检测器、调试接口和数字签名等模块的详细说明和编程指南。
型号- CW32L010
【经验】芯源CW32系列MCU电容式触摸按键设计指南
芯源半导体的CW32系列MCU电容式触摸按键设计指南向客户提供利用CW32内部资源结合软件编程实现电容式触摸按键有效触摸检测的方法。本指南内容重点在于工作原理、软件检测过程以及调试指引。通过本文可了解到如何利用内置电压比较器和内置定时器及软件配合,实现灵活方便的按键检测。在介绍标准演示板和演示软件的性能参数同时,还会给出详细的调试建议以及设计参数选择倾向分析,帮助客户快速自信地完成设计并实施调试。
介绍MCU的ARM处理器——Cortex-M0+内核
ARM Cortex-M0+是2012年3月14日ARM公司发布的一款低功耗效率、能效最高的ARM处理器,可用于存在设计约束的嵌入式应用。它具有最小的硅面积和极少的代码量,从而使开发人员能够以16和8位的价位实现32位性能。处理器的低门数使其能够部署在需要简单功能的应用中。本文中武汉芯源来给大家介绍Cortex-M0+内核,希望对各位工程师有所帮助。
精雕细琢打造MCU,武汉芯源开辟属于自己的Cortex-M0+新赛道!
物联网市场如火如荼,在大量基于Cortex™-M0+的MCU已经面市的情况下,Cortex™-M0+ MCU在以这片红海中还有发展的空间吗?答案是有,近日武汉芯源半导体推出的基于Cortex™-M0+内核CW32L010新品系列就是通过差异化的细节设计开辟了属于自己的新赛道。
【产品】武汉芯源CW32L083系列MCU中断系统介绍
本文针对武汉芯源CW32L083系列MCU,同系列产品亦可参考。ARM® Cortex®-M0+内核的嵌套向量中断控制器(NVIC),用于管理中断和异常。NVIC和处理器内核紧密相连,可以实现低延迟的异常和中断处理。
【经验】武汉芯源CW32系列MCU芯片低功耗模式的特性介绍
武汉芯源CW32系列芯片支持3种工作模式,运行模式、休眠模式以及深度休眠模式,本文以CW32L083为例介绍低功耗模式的特性。
The Application Solution of Wuhan Core Source Semiconductor CW32L083 in Intelligent Gas Meters
The Wuhan Core Source Semiconductor low-power MCU chip CW32L083 series has the characteristics of ultra-low power consumption, high reliability, and abundant resources. In the application of intelligent gas meters, it can more efficiently perform a series of functions such as data collection, display, storage, and transmission.
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。
最小起订量: 1pcs 提交需求>
登录 | 立即注册
提交评论