瑞萨RH850 SPI的异步传输

2024-05-07 11:44
文章标签 异步 传输 spi rh850 瑞萨

本文主要是介绍瑞萨RH850 SPI的异步传输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、SPI工作原理

SPI (Serial Peripheralinterface),顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在EEPROM,FLASH,实时时钟,AD转换器

关于SPI协议,那么我们理解一句话即可。SPI的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

主机与从机连接关系图

RH850/P1x-C SPI组成

RAM数据通过内部数据总线P_Bus向CSIH模块传输数据

  • CSIHnTX0W寄存器写数据接口

  • CSIHnRX0W寄存器读数据接口

  • CSIHnCFGx配置CSIH接口(波特率,奇偶校验,数据方向,数据长度,时间参数等)

  • CTL0/1/2 MCTL0/1/2控制寄存器

配置好CSIH后,RAM向TX0W中写入数据,CSIH自动将数据加载到移位寄存器中,并根据配置好的时钟,波特率,向MOSI上发送数据

同时,MISO将接收到的数据放到移位寄存器后面,当发送完16bit数据后也接收到了16bit数据,这时CSIH将移位寄存器的值复制到RX0W中,RAM可通过RX0W读取接收到的数据

  • CSIH提供一个128 words的RAM空间,4路SPI通道共用(1word = 32bit+7bit ECC)

  • 二、SPI工作模式

    1.Direct access mode直接访问

    直接绕过CSIH提供的RAM区,当数据写入TX0W寄存器时,数据直接复制到移位寄存器中

  • 2.Memory Mode

    使用CSIH提供的RAM空间

根据操作方式不同又可分为3种

  1. FIFO Mode
  • 将数据写入CSIHnTX0W不用等待数据发送完成,可立即写入下一个数据,可以一直把FIFO写满

  • 当接收到一帧数据后,会用接收到的数据覆盖原来发送数据位置

  • 可通过CSIHnRX0W读取数据,读取一次后,FIFO指针自动移动到下一个数据,可以一直读完

  1. Dual buffer mode
  • 把128words的RAM空间氛围两份,一份64words

  • 一份只负责存放发送数据,一份只负责存放接收数据

  1. Transmit-only buffer mode
  • RAM空间只存放发送数据,接收数据不放到RAM中,只能从CSIHnRX0W读取

三、SPI发送数据长度

  • 由于CSIHnTX0W / CSIHnRX0W和移位寄存器的数据长度只有16bit所以一次性最多只能发送16位数据

  1. 2~16bit Data length

当数据长度在2~16bit时,在发送过程中不需要修改配置,只要将数据发送到CSIHnTX0W 即可

  1. Data length greater than 16 bits

  • 需要使能扩展数据长度位EDL is enabled by setting bit CSIHnCTL1.CSIHnEDLE to 1

  • CSIHnTX0W寄存器CSIHnEDL为表示这一块数据后是否还有数据(1有/0无)

  • 当CSIHnTX0W.CSIHnEDL= 1时发送16位数据,CS不变

  • 当CSIHnTX0W.CSIHnEDL= 0时发送CSIHnCFG0.CSIHnDLS[3:0]配置的数据长度,发送完成后CS拉高

Example

Example for sending 40-bit data (123456789AH) to CS0:

40 bits are split 2 × 16 bits plus 8 bits.

• Initialize CSIHnCFG0.CSIHnDLS0[3:0] = 8.

• To send 123456789AH with MSB first, write the following sequence to CSIHnTX0W:

– 20FE 1234H (CSIHnTX0W.CSIHnEDL = 1)

– 20FE 5678H (CSIHnTX0W.CSIHnEDL = 1)

– 00FE 009AH (CSIHnTX0W.CSIHnEDL = 0)

The following figure illustrates the timing.

四、SPI传输数据格式(大小端,略过)

LSB

MSB

五、SPI中断

1. CSIHTIC (communication interrupt)发送数据中断

FIFO模块:发送指定数据的数据后产生中断

Direct access: 每一次数据发送完成后

2. CSIHTIR (communication interrupt)接收数据中断

FIFO模块:接收指定数据的数据后产生中断

Direct access: 每一次数据接收完成后

3. CSIHTIRE (error interrupt)错误中断

  • 4.CSIHTIJC (job completion interrupt)job完成中断

JOB模式开启CSIHnCTL1.CSIHnJE

Job完成后产生中断CSIHnTX0W.CSIHnEOJ = 1

Job中断产生后会替代掉CSIHTIC 中断

六、SPI方案

  1. 方案1:Direct access + 同步传输

  2. 方案2:FIFO+异步传输+ISR

  3. 方案3:FIFO+异步传输+DMA+ISR

七、操作方法

1. Davinci SPI模块配置

SpiJobs: Hw Unit Synchronous配置为ASYNCHRONOUS

SpiMemoryMode:内存模式选择FIFO_MODE

SpiGeneral:使能异步通信

2. SPI接收中断注册

  1. 中断源选择INTCSIHnTIR,接收信号中断

3. 调用方式

在初始化中使用死等,异步的polling模式模拟同步进行通信

在周期化调用中,使用异步发送,中断接收的模式,节省CPU负载

这篇关于瑞萨RH850 SPI的异步传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967253

相关文章

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法