当前位置: 首页 > news >正文

五、关于zephyr上使用spi通信时(如使用dma+回调)需要的配置

首先app.overlay的配置
使用dma+回调方式

&dma1{status="okay";};&dmamux1{status="okay";};&spi2{/* 使用 PLL1_Q 作为 SPI2 时钟源 */pinctrl-0=<&spi2_nss_pb12&spi2_sck_pb13&spi2_miso_pb14&spi2_mosi_pb15>;pinctrl-names="default";status="okay";dmas=<&dmamux1040(STM32_DMA_PERIPH_TX|STM32_DMA_PRIORITY_HIGH)>,<&dmamux1139(STM32_DMA_PERIPH_RX|STM32_DMA_PRIORITY_HIGH)>;dma-names="tx","rx";};

在pro.conf中添加

CONFIG_NOCACHE_MEMORY=y CONFIG_SPI_ASYNC=y CONFIG_SPI=y CONFIG_SPI_STM32=y CONFIG_SPI_STM32_DMA=y CONFIG_SPI_STM32_INTERRUPT=y

main.c测试

#definePACKET_SIZE64#defineTEST_COUNT10/* 测试数据 */staticconstuint8_ttx_pattern[PACKET_SIZE]={0xAA,0x55,0x12,0x34,0xDE,0xAD,0xBE,0xEF,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,0xA5,0x5A,0xA5,0x5A,0xA5,0x5A,0xA5,0x5A,0xFF,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00};__nocachestaticuint8_ttx_buffer[PACKET_SIZE];__nocachestaticuint8_trx_buffer[PACKET_SIZE];/* 同步信号量(用于等待异步回调) */staticK_SEM_DEFINE(spi_sync_sem,0,1);/* 传输结果(回调中写入) */staticintspi_transfer_result;/* SPI 配置 */staticstructspi_configspi2_cfg={.frequency=16000000,.operation=SPI_OP_MODE_MASTER|SPI_WORD_SET(8)|SPI_TRANSFER_MSB,.slave=0,};/* ================================================================ * 异步传输完成回调 * 在中断上下文中调用,仅做标记+释放信号量,不能做耗时操作 * ================================================================ */staticvoidspi_transfer_done(conststructdevice*dev,intresult,void*user_data){spi_transfer_result=result;k_sem_give(&spi_sync_sem);}/* ================================================================ * 单次异步收发(封装:提交 + 等待回调) * 返回 0 成功,负值为错误码 * ================================================================ */staticintspi_transceive_async_once(conststructdevice*dev,conststructspi_config*cfg,constuint8_t*tx_data,size_ttx_len,uint8_t*rx_data,size_trx_len,int32_ttimeout_ms){/* 构建 TX buf */structspi_buftx_buf={.buf=(void*)tx_data,.len=tx_len,};structspi_buf_settx_set={.buffers=&tx_buf,.count=1,};/* 构建 RX buf */structspi_bufrx_buf={.buf=rx_data,.len=rx_len,};structspi_buf_setrx_set={.buffers=&rx_buf,.count=1,};/* 提交异步传输 */intret=spi_transceive_cb(dev,cfg,&tx_set,&rx_set,spi_transfer_done,NULL);if(ret<0){printk("spi_transceive_cb submit failed: %d\n",ret);returnret;}/* 等待回调唤醒 */ret=k_sem_take(&spi_sync_sem,K_MSEC(timeout_ms));if(ret!=0){printk("SPI transfer timeout! (%d)\n",ret);return-ETIMEDOUT;}/* 检查传输结果 */if(spi_transfer_result<0){printk("SPI transfer error: %d\n",spi_transfer_result);returnspi_transfer_result;}return0;}voidmy_thread(void*arg1,void*arg2,void*arg3){intpass=0,fail=0;k_msleep(500);printk("\n");printk("============================================\n");printk(" SPI2 + DMA Async Loopback Test\n");printk(" Connect: PB14(MISO) <-> PB15(MOSI)\n");printk(" Packet size: %d bytes\n",PACKET_SIZE);printk("============================================\n\n");conststructdevice*spi2=DEVICE_DT_GET(DT_NODELABEL(spi2));if(!device_is_ready(spi2)){printk("ERROR: SPI2 device not ready!\n");while(1){k_sleep(K_FOREVER);}}printk("SPI2 device ready\n");printk("tx_buffer addr: %p\n",tx_buffer);printk("rx_buffer addr: %p\n",rx_buffer);memcpy(tx_buffer,tx_pattern,PACKET_SIZE);/* 循环测试 */for(inti=0;i<TEST_COUNT;i++){memset(rx_buffer,0,PACKET_SIZE);intret=spi_transceive_async_once(spi2,&spi2_cfg,tx_buffer,PACKET_SIZE,rx_buffer,PACKET_SIZE,11000);if(ret<0){printk("[%2d] FAIL: error %d\n",i,ret);fail++;continue;}if(memcmp(tx_buffer,rx_buffer,PACKET_SIZE)==0){printk("[%2d] PASS\n",i);pass++;}else{printk("[%2d] FAIL: data mismatch\n",i);printk(" byte[0]: tx=0x%02X rx=0x%02X\n",tx_buffer[0],rx_buffer[0]);fail++;}k_msleep(100);}printk("\n============================================\n");printk(" Result: PASS=%d FAIL=%d (Total=%d)\n",pass,fail,TEST_COUNT);printk("============================================\n");while(1){k_msleep(1000);}}

使用正常的收发方式(即收发一体),上面配置中取消dma相关即可。

main.c

#definePACKET_SIZE8staticconstuint8_ttx_pattern[PACKET_SIZE]={0xAA,0x55,0x12,0x34,0xDE,0xAD,0xBE,0xEF};staticuint8_trx_buffer[PACKET_SIZE];staticstructspi_configspi2_cfg_fast={.frequency=16000000,.operation=SPI_TRANSFER_LSB|SPI_WORD_SET(8)|SPI_TRANSFER_MSB|SPI_MODE_CPOL|SPI_MODE_CPHA,.slave=0,};voidmy_thread(void*arg1,void*arg2,void*arg3){intpass=0,fail=0;printk("=== SPI2 Interrupt Loopback Test ===\n");printk("Connect PB14(MISO) <-> PB15(MOSI)\n\n");conststructdevice*spi2=DEVICE_DT_GET(DT_NODELABEL(spi2));if(!device_is_ready(spi2)){printk("SPI2 not ready!\n");}printk("SPI2 ready\n\n");for(inti=0;i<10;i++){memset(rx_buffer,0,PACKET_SIZE);structspi_buftx={.buf=(void*)tx_pattern,.len=PACKET_SIZE};structspi_bufrx={.buf=rx_buffer,.len=PACKET_SIZE};structspi_buf_settx_set={.buffers=&tx,.count=1};structspi_buf_setrx_set={.buffers=&rx,.count=1};intret=spi_transceive(spi2,&spi2_cfg_fast,&tx_set,&rx_set);if(ret<0){printk("Iter %d: fail\n",i);fail++;continue;}if(memcmp(tx_pattern,rx_buffer,PACKET_SIZE)==0){printk("Iter %d: OK\n",i);pass++;}else{printk("Iter %d: mismatch\n",i);fail++;}}printk("\n=== Result: Pass=%d Fail=%d ===\n",pass,fail);while(1){k_msleep(1000);}}
http://www.gsyq.cn/news/1625798.html

相关文章:

  • 3步搭建智能家居系统:Home Assistant操作系统完整指南
  • 生产级机器学习服务:稳定性治理与可观测性实战
  • 怎样高效获取网络媒体资源:开源工具的智能跨平台解决方案
  • 网易云音乐API:5分钟搭建个人音乐服务的终极解决方案
  • 科研配图零门槛!okbiye 双分区 AI 绘图一站式搞定全学科论文可视化
  • 告别科研作图内卷!一站式 okbiye AI 科研绘图,贴合期刊标准高效出学术图
  • git合并代码记录
  • 民宿领域搜索与个性化推荐算法体系深度对比:召回、排序与冷启动技术解析
  • 深度解析Obsidian Jupyter插件:在笔记中无缝执行Python代码的3种实战方法
  • 写论文要切 5 个平台?虎贲 AI 从选题到答辩全搞定,实证图表自动生成
  • 如何在通达信中实现自动化缠论分析:ChanlunX技术实现深度解析
  • 无电源排序的双向电平转换:ASC0101S推挽24Mbps模式下的工程实践与系统集成
  • ChatGPT批量处理任务必须掌握的6个底层参数:max_tokens、temperature、seed、response_format…工程师都在忽略的精度控制键
  • 安川弧焊电源节气原理分享
  • 企业级开源CMDB系统架构解析:构建智能IT资产管理的5大核心设计原则
  • 科研制图告别复杂软件!okbiye AI 绘图分档功能一站式解决全学科出图难题
  • 多维聚合数据操作:切片、钻取与立方体构建实战
  • 装备制造行业PLM软件系统最新厂商盘点,助力行业数字化转型
  • 我用 Codex 重写了同事维护三年的代码,他没说谢谢——而是找了领导
  • 父系边界即文明边界
  • GetQzonehistory:5分钟快速找回QQ空间全部历史说说完整指南
  • 收藏 | Java程序员转战大模型,8个月薪资涨50%,小白也能轻松入门!
  • 智能建筑 KNX 选型攻略:施耐德与 ABB 全维度对比,附常用型号清单
  • 五大神经网络架构核心原理与实战指南:CNN、RNN、Transformer、GAN、GNN
  • 在M1 Mac上运行Android模拟器的完整指南:告别卡顿,享受原生性能
  • HarmonyOS APP《画伴梦工厂》开发第26篇:安全权限管理——abilityAccessCtrl 实战
  • AI入门PPT大纲:原理、应用、挑战与趋势全解析
  • 五维智能技术赋能产业运维新变革
  • 如何构建高效企业级CMDB系统:open-cmdb实战指南
  • 【OpenHarmony/HarmonyOs 】学习类 App 如何做好隐私保护:禁止 AI 识图、精细化权限与本地数据方案