大家好!
我正在寻找 SPI 从属示例,王先生在这个线索中指出了其中的一些示例:
我对 SPI DMA 传输非常感兴趣。
但本示例仅显示(但非常感谢)如何在 DMA 中将数据写入 SPI 从属设备。 但在 DMA 中从 SPI 从属设备读取数据的情况如何? 更准确地说,向 SPI 从属设备写入一些命令字节,并根据其读取同一 SPI 帧中仍在 DMA 中的 SPI 从属设备中的给定数据。
此致,
法比安
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好!
我正在寻找 SPI 从属示例,王先生在这个线索中指出了其中的一些示例:
我对 SPI DMA 传输非常感兴趣。
但本示例仅显示(但非常感谢)如何在 DMA 中将数据写入 SPI 从属设备。 但在 DMA 中从 SPI 从属设备读取数据的情况如何? 更准确地说,向 SPI 从属设备写入一些命令字节,并根据其读取同一 SPI 帧中仍在 DMA 中的 SPI 从属设备中的给定数据。
此致,
法比安
您好,法比安,
要开始 SPI 通信,主中继器必须发送时钟信号,并通过启用 CS 信号(通常为低有效)来选择从中继器。 SPI 是一个全双工接口;主和从都可以同时通过 MOSI 和味噌线路发送数据。 在 SPI 通信期间,数据同时传输(串行转移到 MOSI/SDO 总线上)并接收(总线上的数据(miso/SDI)被采样或读取)。 串行时钟边缘同步数据的移动和采样。
每次将 TX 数据从 TXBUF 或 SPIDAT1复制到 TX 移位寄存器时,SPI 都会在 TX_DMA_REQ 行上生成请求。
每次将收到的数据复制到 SPIBUF 时,SPI 都会在 RX_DMA_REQ 行上生成请求。
应配置 SPI 从服务器并准备好在主服务器开始传输数据之前接收数据。
对于 SPI 从 TX DMA 数据包设置:
G_dmaCTRLPPT_TX.Sadd =&TX_DATA;/*源地址*/
G_dmaCTRLPPT_TX.DADD =(((UINT32_t)(&(spireg1->DAT1))+ 2);/* SPI1配置为从属地址,目的地址*/
G_dmaCTRLKPT_TX.CHCTRL = 0;/*通道控制*/
G_dmaCTRLKPT_TX.FRCNT =帧计数;/*帧计数*
G_dmaCTRLKPT_TX.ELCNT = ElmntCnt;/*元素计数*/
G_dmaCTRLPKT_TX.ELDOFFSET = 0;/*元素目标偏移量*/
G_dmaCTRLPKT_TX.ELSOFFSET = 0;/*元素目标偏移量*/
G_dmaCTRLPKT_TX.FRDOFFSET = 0;/*帧目标偏移量*/
G_dmaCTRLPKT_TX.FRSOFFSET = 0;/*帧目标偏移量*/
G_dmaCTRLPKT_TX.PORTASGN = 4;/*端口 b *
G_dmaCTRLKPT_TX.RDSIZE = ACCESS_16_BIT;/*读取大小*/
G_dmaCTRLKPT_TX.WRSIZE = ACCESS_16_bit;/*写入大小*/
G_dmaCTRLKPT_TX.tType =帧传输;/*传输类型*/
G_dmaCTRLKPT_TX.ADDMADERD = ADDR_INC1;/*地址模式读取*/
G_dmaCTRLPKT_TX.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPPT_TX.AUTOINIT = AUTOINIT_ON;/* autocinit *
对于 SPI 从属 RX DMA 数据包设置:
G_dmaCTRLPPT_RX.Sadd =((UINT32_t)(&(spireg1->BUF))+ 2);/* SPI1配置为从属源地址*/
G_dmaCTRLPPT_RX.DADD =&RX_DATA;/*目标地址*/
G_dmaCTRLKPT_RX.CHCTRL = 0;/*通道控制*/
G_dmaCTRLKPT_RX.FRCNT =帧计数;/*帧计数*/
G_dmaCTRLKPT_RX.ELCNT = ElmntCnt;/*元素计数*/
G_dmaCTRLKPT_RX.ELDOFFSET = 0;/*元素目标偏移量*/
G_dmaCTRLKPT_RX.ELSOFFSET = 0;/*元素目标偏移量*/
G_dmaCTRLKPT_RX.FRDOFFSET = 0;/*帧目标偏移量*/
G_dmaCTRLKPT_RX.FRSOFFSET = 0;/*帧目标偏移量*/
G_dmaCTRLPPKT_RX.PORTASGN = 4;/*端口 b *
G_dmaCTRLKPT_RX.RDSIZE = ACCS_16_bit;/*读取大小*/
G_dmaCTRLKPT_RX.WRSIZE = ACCS_16_bit;/*写入大小*/
G_dmaCTRLPPT_Rx.tType =帧传输;/*传输类型*/
G_dmaCTRLKPT_RX.ADDMADERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLKPT_RX.ADDMODEWR = ADDR_INC1;/*地址模式写入*/
G_dmaCTRLKPT_RX.AUTOINIT = AUTOINIT_ON;/*自动初始化*/