论坛» 嵌入式开发» MCU

求助瑞萨工程师关于用DMA实现串口连续收发的问题

菜鸟
2008-11-07 14:44 1楼
要求每次传送8个字节的数据,使用时钟异步串行模式。不知道如何才能让DMA工作?以发送为例:我设定的DMA触发源为UART0发送中断(TI=0),程序段如下,希望各位帮忙找到问题,谢谢!

#include "sfr28.h"

void mcu_init(void);

void io_init(void);

void dma_init(void);

unsigned short rcv_data[8];

void main(void)

{

mcu_init();

io_init();

dma_init();

asm("fset i");

dm0con |=0x08;

u0c1 |=0x05;

while(1);

}

void mcu_init(void)

{

prcr=0x03;
pm0=0x00;//Single-chip mode

pm1=0x08;//No wait,No expansion

cm0=0x08;//XCIN-XCOUT High

cm1=0x20;
pm2=0x00;

pclkr=0x03;//TAiTBiSI/O clock select bit

prcr=0x00;//Protects all registers

}

void io_init(void)

{

u0mr=0x05;//UART mode

u0c0=0x10;//BRG f1 or f2

u0brg=129;//n=129

u0c1=0x00;

ucon=0x01;//set U0C1

u2smr=0x00;

u2smr2=0x00;

u2smr3=0x00;

u2smr4=0x00;

s0ric=0;

}

void dma_init(void)

{

dm0sl=0x0a;

dm0con=0x10;

sar0_addr.byte.low=(char)( &rcv_data);

sar0_addr.byte.mid=(char)((unsigned long)(& rcv_data)>>8);

sar0_addr.byte.high=(char)((unsigned long)(& rcv_data)>>16);

dar0_addr.byte.low=(char)(&u0tb);

dar0_addr.byte.mid=(char)((unsigned long)(& u0tb)>>8);

dar0_addr.byte.high=(char)((unsigned long)(& u0tb)>>16);//set DMA0 transfer counter

tcr0=7;

dm0ic=4;//set DMA0 interrupt priority-level=4

}
我尝试在while(1)前加上u0tb=0x5a,但是DMA仍然没有运行,只能收到0x5a本身。

菜鸟
2008-11-13 11:24 2楼
“我尝试在while(1)前加上u0tb=0x5a,但是DMA仍然没有运行,只能收到0x5a本身。”
您所说“DMA仍然没有运行”是指没有进入DMA中断吗?“只能收到0x5a本身”是指接收端只能收到1个字节数据是吗?
助工
2008-11-19 17:53 3楼
请参考:
http://documentation.renesas.com/eng/products/region/rtcn/mpumcu/apn/rcc05b0070_m16cap.pdf
这个是M16C/62P的,28与62P基本相同。
共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]