【国产mcu填坑篇】华大单片机(小华半导体)一、SPI的DMA应用(发送主机)HC32L136

news2024/9/29 17:25:55
  • 最近需要用华大的hc32l136的硬件SPI+DMA传输,瞎写很久没调好,看参考手册,瞎碰一天搞通了。。。
    • 先说下我之前犯的错误,也是最宝贵的经验,供参考
      • 没多看参考手册直接写(即使有点烂仍然提供了最高的参考价值。。。),重点看SPIDMAC章节
      • 错误使用了软件触发传输,测到的现象是前两个字节可以正确发送,后面的无论是发送数量和数据都对不上了,误以为软件触发可用,自己的配置有问题,实际测试软件触发和规格书讲的一样,是不可用的或者说是不可靠的
    • 再说下正确的使用方式,文末会粘上测试代码
      • 关键点就一个,触发方式不要选DmaSWTrig软件触发(至于最后实例能用的这个,从软件的角度看还是软件触发,但官方的角度似乎不认为这是软件触发,或许是软件触发SPI硬件再触发DMA所以叫硬件触发?不管也罢,,,)
  • 语文课兴许没及格,下面是参考手册的一些相关描述,没看明白:
  1. 先讲SPI支持软硬件访问
    在这里插入图片描述
    2.再讲只支持硬件块传输模式,且SPI和系统时钟不同频时不支持硬件触发(官方对软件/硬件触发的解释不是很到位,至少和我理解的不太一样)
    在这里插入图片描述
  2. 但是spi时钟和系统时钟必然是不同频的,那硬件触发到底能不能用呢?
    在这里插入图片描述
  3. 再看,所谓的软件/硬件DMA传输模式就是软件/硬件请求方式不同,似乎哪个也不支持了。。。软硬件触发和软硬件传输似乎没有关系?
    在这里插入图片描述
  • 最后,还是实践出真知。。。
  • 测试程序参考,每200ms用SPI+DMA发送24个字节:
#define SPI_HANDLE M0P_SPI1
#define DMA_HANDLE DmaCh1

uint8_t data_tx_test[24] =
{
  0x11,0x22,0x23,0x44,0x55,0x66,0x77,0x88,
  0x11,0x22,0x23,0x44,0x55,0x66,0x77,0x88,
  0x11,0x22,0x23,0x44,0x55,0x66,0x77,0x88,
};

//主要是CS/CLK/MOSI三个脚,不相干引脚忽略即可
static void App_GpioInit(void)		
{
    stc_gpio_cfg_t           stcPortCfg;
    
    DDL_ZERO_STRUCT(stcPortCfg);							//结构体初始化清零
    
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //GPIO 外设时钟使能
    
    stcPortCfg.enDrv = GpioDrvH;
    stcPortCfg.enDir  = GpioDirOut;
	
    Gpio_Init(LCD_BK_PORT, LCD_BK_PIN, &stcPortCfg);  
	
    Gpio_Init(LCD_CS_PORT, LCD_CS_PIN, &stcPortCfg);  
	Gpio_SetAfMode(LCD_CS_PORT, LCD_CS_PIN,GpioAf1); 				//CS
	
    Gpio_Init(LCD_RESET_PORT, LCD_RESET_PIN, &stcPortCfg);  
	
    Gpio_Init(LCD_WR_PORT, LCD_WR_PIN, &stcPortCfg);  
	
    Gpio_Init(LCD_SCK_PORT, LCD_SCK_PIN, &stcPortCfg);  
	Gpio_SetAfMode(LCD_SCK_PORT, LCD_SCK_PIN,GpioAf1);  			//CLK
	
    Gpio_Init(LCD_SDA_PORT, LCD_SDA_PIN, &stcPortCfg);  
	Gpio_SetAfMode(LCD_SDA_PORT, LCD_SDA_PIN,GpioAf1);  			//MOSI	
}

static void App_SPIInit(void)
{
    stc_spi_cfg_t  SpiInitStruct;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi1,TRUE);

    //SPI0模块配置:主机
    SpiInitStruct.enSpiMode = SpiMskMaster;   		//配置位主机模式
    SpiInitStruct.enPclkDiv = SpiClkMskDiv2;  		//波特率:fsys/2
    SpiInitStruct.enCPOL    = SpiMskcpolhigh;  		//极性
	SpiInitStruct.enCPHA 	= SpiMskCphasecond; 	//第二电平采样
    Spi_Init(SPI_HANDLE, &SpiInitStruct);
	
	Spi_FuncEnable(SPI_HANDLE,SpiMskDmaTxEn);		//这里只使用了发送功能
}

static void App_DmaCfg(void)
{ 
    stc_dma_cfg_t stcDmaCfg;
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralDma,TRUE); 			//打开DMA时钟
  
    DDL_ZERO_STRUCT(stcDmaCfg);
  
    stcDmaCfg.enMode =  DmaMskBlock;                           		//选择块传输
    stcDmaCfg.u16BlockSize = 1;                             		//块传输个数
    stcDmaCfg.u16TransferCnt = 24;                    				//块传输次数,一次传输数据大小为 块传输个数*BUFFER_SIZE
    stcDmaCfg.enTransferWidth = DmaMsk8Bit;                   		//传输数据的宽度,此处选择字(8Bit)宽度
    stcDmaCfg.enSrcAddrMode = DmaMskSrcAddrInc;                		//源地址自增
    stcDmaCfg.enDstAddrMode = DmaMskDstAddrFix;                		//目的地址固定
    stcDmaCfg.enDestAddrReloadCtl = DmaMskDstAddrReloadEnable;		//使能重新加载传输目的地址
    stcDmaCfg.enSrcAddrReloadCtl = DmaMskSrcAddrReloadEnable;		//使能重新加载传输源地址
    stcDmaCfg.enSrcBcTcReloadCtl = DmaMskBcTcReloadEnable;			//使能重新加载BC/TC值
    stcDmaCfg.u32SrcAddress = (uint32_t)&data_tx_test[0]; 			//指定传输源地址
    stcDmaCfg.u32DstAddress = (uint32_t)&(M0P_SPI1->DATA);    		//指定传输目的地址
    stcDmaCfg.enRequestNum = DmaSPI1TXTrig;                        	//设置为硬件触发
    stcDmaCfg.enTransferMode = DmaMskOneTransfer;              		//dma只传输一次,DMAC传输完成时清除CONFA:ENS位
    stcDmaCfg.enPriority = DmaMskPriorityFix;                  		//各通道固定优先级,CH0优先级 > CH1优先级
    
    Dma_InitChannel(DMA_HANDLE,&stcDmaCfg);                        	//初始化dma通道0
  
    Dma_Enable();
    //Dma_EnableChannel(DMA_HANDLE);								//开启通道即开启一次发送
}

void dma_test(void)
{
	en_dma_stat_t ste;
	while(1)
	{ 

		delay1ms(200);
		M0P_SPI1->SSN = FALSE;
		Dma_EnableChannel(DMA_HANDLE);								//启动传输,所以这种方式到底算软件还是硬件??
		
		ste = Dma_GetStat(DMA_HANDLE);
		while(ste != DmaTransferComplete)
		{
			ste = Dma_GetStat(DMA_HANDLE);
		}
		M0P_SPI1->SSN = TRUE;
		
	}
}


void demo(void)
{
	App_GpioInit();
	App_DmaCfg();
	App_SPIInit();
	
	dma_test();
}
  • 实测SPI主机发送ok:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1379041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32和ESP8266的物联网应用开发与实现

基于STM32和ESP8266的物联网应用开发与实现可以实现智能家居、智能工业、环境监测等多种应用,它将结合STM32微控制器的实时控制能力和ESP8266无线通信模块的WiFi连接能力。在本文中,我们将介绍如何设计和实现这样的物联网应用,并提供相关的代…

2024年AMC8往年真题练一练和答案详解(6),还有全真模拟题

今天是1月13日,2024年AMC8正式比赛已经倒计时了,昨天AMC主办方给所有参赛选手发了短信通知,关于模拟竞赛的操作方式和实际比赛的要求指南,大家一定要认真阅读,严格按指南操作,六分成长也会详细为大家解读和…

SQL Server的彻底卸载的方式

这篇文章主要介绍了SQL Server的彻底卸载的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 SQL Server的彻底卸载与再次安装 可能大家已经有深刻体会,SQL Server的卸载十分繁琐。最让人头…

Web3的应用发展及其影响

Web3,又被称为去中心化Web,是互联网发展的一个阶段,其核心特点是数据的去中心化和用户自主权。近年来,随着区块链技术的不断成熟,Web3的应用也得到了广泛的关注和发展。在这篇文章中,我们将深入探讨Web3目前…

sqlilabs第五十一五十二关

Less-51(GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 源码 单引号闭合用注释(没有后续输出只能堆叠注入) 自动注入 和上一关一样 Less-52(GET - Bind based - ORDER BY CLAUSE-numeric- Stacked injection) 手工注入 数字类型 不用注释直接…

uniapp小程序当页面内容超出时显示滚动条,不超出时不显示---样式自定义

使用scroll-view中的show-scrollbar属性 注意:需要搭配enhanced使用 否则无效 <scroll-view class"contentshow" scroll-y :show-scrollbartrue :enhancedtrue><view class"content" :show-scrollbartrue><text>{{vehicleCartinfo}}<…

[机缘参悟-125] :实修 - “心性、自性”与“知识、技能”的区别,学习、修、悟的区别?

目录 一、“知识、技能” 1.1 什么是知识技能 1.2 知识、技能的位置 1.3 知识、技能的学习方法 二、"明心见性" 2.1 什么是"明心见性" 2.2 "明心见性"解读 2.2.1 何其自性&#xff0c;本自清净&#xff1b; 2.2.2 何其自性&#xff0c;…

2-Linux-应用-部署icwp-Linux虚拟机【Django+Vue+Nginx+uwsgi+Linux】

本文概述 本文章讲述基于Linux CentOS 7系统&#xff08;虚拟机&#xff09;&#xff0c;部署DjangoVue开发的前后端分离项目。 项目源码不开放&#xff0c;但是操作步骤可以借鉴。 该文章将项目部署在Linux虚拟机上&#xff0c;暂不使用Docker 相关指令尽量展示执行路径&am…

什么是网络数据抓取?有什么好用的数据抓取工具?

一、什么是网络数据抓取 网络数据抓取&#xff08;Web Scraping&#xff09;是指采用技术手段从大量网页中提取结构化和非结构化信息&#xff0c;按照一定规则和筛选标准进行数据处理&#xff0c;并保存到结构化数据库中的过程。目前网络数据抓取采用的技术主要是对垂直搜索引…

FineBI实战项目一(22):各省份订单个数及订单总额分析开发

点击新建组件&#xff0c;创建各省份订单个数及订单总额组件。 选择自定义图表&#xff0c;将province拖拽到横轴&#xff0c;将cnt和total拖拽到纵轴。 调节纵轴的为指标并列。 修改横轴和纵轴的标题。 修改柱状图样式&#xff1a; 将组件拖拽到仪表板。 结果如下&#xff1a;…

Casper Network (CSPR)2024 年愿景:通过投资促进增长

Casper Network (CSPR&#xff09;是行业领先的 Layer-1 区块链网络之一&#xff0c;通过推出了一系列值得关注的技术改进和倡议&#xff0c;已经为 2024 年做好了准备。 在过去的一年里&#xff0c;Casper Network (CSPR&#xff09;不断取得里程碑式的进展&#xff0c;例如推…

鸿蒙Harmony--LocalStorage--页面级UI状态存储详解

走的太急疼的是脚&#xff0c;逼的太紧累的是心&#xff0c;很多时候&#xff0c;慢一点也没关系&#xff0c;多给自己一些耐心和等待&#xff0c;保持热爱&#xff0c;当下即是未来&#xff0c;生活自有安排! 目录 一&#xff0c;定义 二&#xff0c;LocalStorageProp定义 三…

网络安全全栈培训笔记(52-WEB攻防-通用漏洞弱口令安全社工字典生成服务协议web应用)

第52天 WEB攻防-通用漏洞&弱口令安全&社工字典生成&服务协议&web应用 知识点&#xff1a; 1、弱口令安全&配置&初始化等 2、弱口令对象&Web&服务&应用等 3、弱口令字典&查询&列表&列表等 #前置知识&#xff1a; 弱口令(weak…

conda环境下cannot write keep file问题解决

1 问题描述 conda环境下执行如下命令报错&#xff1a; pip install githttps://github.com/wenet-e2e/wenet.git 错误信息如下&#xff1a; (pt) PS D:\code\ptcontainer> pip install githttps://github.com/wenet-e2e/wenet.git Looking in indexes: http://pypi.doub…

CDH 6.3启动失败,由于日志写入权限原因导致cloudera-scm-server.log未生成

CDH 6.3启动失败&#xff0c;CM之前都能正常启动&#xff0c;服务器重启后&#xff0c;启动出现异常&#xff0c;需要排查具体错误&#xff0c;查看日志&#xff0c;发现日志cloudera-scm-server.log也未生成&#xff0c;不好定位具体原因。于是查看cloudera-scm-server状态&am…

【深度学习目标检测】十四、基于深度学习的血细胞计数系统-含GUI(BCD数据集,yolov8)

血细胞计数是医学上一种重要的检测手段&#xff0c;用于评估患者的健康状况&#xff0c;诊断疾病&#xff0c;以及监测治疗效果。而目标检测是一种计算机视觉技术&#xff0c;用于在图像中识别和定位特定的目标。在血细胞计数中&#xff0c;目标检测技术可以发挥重要作用。 首先…

Zabbix6.0全套落地方案-基于RHEL9系列源码编译安装-Linux+Nginx+Mysql+Redis生产级模板及Agent2客户端一键部署

实践说明&#xff1a;基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)&#xff0c;但适用场景不限于此&#xff0c;客户端一键部署安装包基于RHEL8和RHEL9。 文档形成时期&#xff1a;2023年 因系统或软件版本不同&#xff0c;构建部署可能略有差异&#xff0c;但本文未做细分…

XYplorer:双栏多标签文件资源管理器的高效选择

在文件管理的世界中&#xff0c;效率和便捷性是用户追求的关键。XYplorer作为一款专为Windows设计的文件资源管理器&#xff0c;以其独特的双栏多标签浏览、强大的文件搜索功能、以及高度可定制的界面&#xff0c;为用户提供了一种全新的文件管理体验。 XYplorer&#xff1a;速…

Android 12.0 系统开启和关闭黑白模式主题功能

1.概述 在12.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

Spark Doris Connector 可以支持通过 Spark 读取 Doris 数据类型不兼容报错解决

1、版本介绍&#xff1a; doris版本&#xff1a; 1.2.8Spark Connector for Apache Doris 版本&#xff1a; spark-doris-connector-3.3_2.12-1.3.0.jar:1.3.0-SNAPSHOTspark版本&#xff1a;spark-3.3.1 2、Spark Doris Connector Spark Doris Connector - Apache Doris 目…