完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我使用“DSPIC33 EP256MC506”。在使用SPI时,我可以看到SCK和SDO的波形。但在使用DMA的SPI时,我不做任何波形。
以上来自于百度翻译 以下为原文 I use 'DSPIC33EP256MC506'. I can see the waveform of SCK and SDO at using only SPI. But I do not make any waveform at using SPI with DMA. uint16_t TxBufferA[22]; int main(void) { // initialize the device SYSTEM_Initialize(); /* SPI Init */ SPI2CON1 = 0x20; SPI2CON2 = 0x1; SPI2STAT = 0x800C; /* DMA Init */ DMA0CON= 0xE000 & 0x7FFF; // or 0x2002 or 2001 or 2000 DMA0REQ= 0x21; // DMA0CNT= 0xF; DMA0STAL= TxBufferA; DMA0STAH= 0x0; DMA0PAD = &SPI2BUF; IFS0bits.DMA0IF = false; IEC0bits.DMA0IE = 1; DMA0CONbits.CHEN = 1; DMA0REQbits.FORCE = 1; // Force First Word while (1) { __delay_ms(200); LED0_Toggle(); DMA0REQbits.FORCE = 1; // while( SPI2STATbits.SPITBF == true ) {} // This line(2 lines) is for TEST at SPI Port without DMA. // SPI2BUF = 0x50; // if use this line, I can see the waveform SCK & SDO. } } |
|
相关推荐
2个回答
|
|
对于SPI外设,通常需要2个DMA通道,一个用于TX,一个用于RX侧。然而,看起来你只是在发送(忽略任何被接收的东西——除非你在从属模式下,这是可以的)。正如你所做的,你需要“强制”第一个TX或者做你已经做过的事情并且自己写第一个值。参见适当的SPI FRM文档的第5部分。(我不能B)其他解码你的魔法数字来初始化SPI外围广告,DMA控制寄存器-我假设它们是正确的。)在你的主循环中,我不依赖于“延迟”来看到DMA交换的完成。当您使用DMA ISR时,我会在其中设置一个标志,并在主循环中等待它的设置。如果您使用“代码”标签,您的代码将在这些帖子中更可读。苏珊
以上来自于百度翻译 以下为原文 For the SPI peripheral, typically to need 2 DMA channels-one for the TX and one for the Rx sides. However it looks as though you are only sending (and ignoring whatever is received - this is OK unless you are in slave mode). As you have done you need to 'force' the first Tx or do what you have done and write the first value yourself. See Section 5 of the appropriate SPI FRM document. (I can't be bothered decoding your magic numbers to initialise the SPI peripheral ad the DMA control registers - I assume they are correct.) In your main loop I would not rely on a 'delay' to see the completion of the DMA exchange. As you are using the DMA ISR, I would set a flag in there and wait in the main loop for it to be set. Also if you use the 'code' tags, your code will be more readable in these postings. Susan |
|
|
|
谢谢你,Aussie Susan。我用的是“力第一(DMA0ReqBist.For=1;)”,但是我不能用示波器看到任何波形。所以,我只测试SPI。如果我使用两行命令“SPI2Buffor直接写入”while循环,我会看到SCK&SDO的波形。我改变代码标签。谢谢,帮帮我。
以上来自于百度翻译 以下为原文 Thank you Aussie Susan. I use the for the' Force first(DMA0REQbits.FORCE=1;)' but I can't see any waveform by oscilloscope. So, I test only SPI. If I use two line command 'SPI2buffer for directly write' in while loop, i see the waveform of SCK & SDO. I change code tag. thank you. Help me .. |
|
|
|
只有小组成员才能发言,加入小组>>
5031 浏览 9 评论
1933 浏览 8 评论
1870 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3084 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2155 浏览 5 评论
597浏览 1评论
465浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
493浏览 0评论
395浏览 0评论
IPECMD命令烧录AVR128DA48芯片,报找不到芯片错误
873浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-2 07:24 , Processed in 1.036163 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191