您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 技术讨论区 -> 关于UART DMA方法通讯的问题
本帖共有1980个阅读者
发表帖子 发表投票 回复主题
关于UART DMA方法通讯的问题
Runner(论坛新手)
Runner
头衔:社区公民
帮派:无帮无派
帖数:29
金钱:332
积分:36
注册时间:2012/10/9
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
关于UART DMA方法通讯的问题
首先上源码

volatile char RXbuf[4];
volatile char TXbuf[4];
char TPbuf[4];
bool flag=0;

EX_INTERRUPT_HANDLER(UART_ISR);

void Enable_DMA_UART(void)
{
*pDMA7_CONFIG |= DMAEN;
ssync;
*pDMA8_CONFIG |= DMAEN;
ssync;
}


void Disable_DMA_UART(void)
{
*pDMA7_CONFIG &= ~DMAEN;
ssync;
*pDMA8_CONFIG &= ~DMAEN;
ssync;
}

void Init_DMA_UART(void)
{
Disable_DMA_UART();
*pDMA7_PERIPHERAL_MAP = 0x7000; //p5-66
ssync;
*pDMA7_CONFIG = WNR | WDSIZE_8 | DI_EN | FLOW_AUTO | SYNC;
ssync;
*pDMA7_START_ADDR = (void *)RXbuf;
ssync;
*pDMA7_X_COUNT = 2;
ssync;
*pDMA7_X_MODIFY = 1;
ssync;
*pDMA8_PERIPHERAL_MAP = 0x8000;
ssync;

*pDMA8_CONFIG = WDSIZE_8 | FLOW_AUTO | DI_EN | SYNC;
ssync;
*pDMA8_START_ADDR = (void *)TXbuf;
ssync;
*pDMA8_X_COUNT = 2;
ssync;
*pDMA8_X_MODIFY = 1;
ssync;
}

void Init_UART(int baudrate)
{
int SYSCLK;
int DIV;
Init_DMA_UART();
Enable_DMA_UART();
// start init UART0
*pUART0_GCTL=0x0001;  //p11-31

SYSCLK = (int)Get_Sys_Clk();
DIV = (int)(SYSCLK/16/baudrate);
*pUART0_LCR=DLAB;//p11-21 //DLAB=1 ÔêDí·ÃÎêDLL oíDLH
ssync;
*pUART0_DLL=DIV;
ssync;
*pUART0_DLH=DIV>>8;
ssync;
*pUART0_LCR=WLS(8) ;
ssync;
*pUART0_IER= ERBFI | ETBEI; //  ERBFI: Enable Receiver Buffer Full Interrupt; ETBFI: Enable Transmit Buffer Empty Interrupt //p11-26
ssync;

// map interrupt
*pSIC_IAR1 &= ~0xf0000000; // p4-18, Table 4-3. Peripheral Interrupt Events
*pSIC_IAR1 |=  P15_IVG(10);     // UART ÖD¶Ï¶¨òå
ssync;
// map interrupt
*pSIC_IAR2 &= ~0xf; // p4-18, Table 4-3. Peripheral Interrupt Events
*pSIC_IAR2 |=  P16_IVG(10);     // UART ÖD¶Ï¶¨òå
ssync;
register_handler(ik_ivg10, UART_ISR); // UART ISR -> IVG 10
ssync;
*pSIC_IMASK |= IRQ_DMA7 | IRQ_DMA8;
ssync;
}


/****************************************************************************
* Ãû3Æ £ouart_device_write
* 1|Äü £o UART·¢Ëíoˉêy
* èë¿ú2Îêy £o*buf,len
* ·μ»ØÖμ £oÎT
****************************************************************************/

int uart_device_write(char *buf, int len)
{
int i=1;
//delay_Uart(50);
for(i=0;i<len;i++)
{
*pUART0_THR = buf[i];
while(!(*pUART0_LSR&0x20));
}
return i;
}

EX_INTERRUPT_HANDLER(UART_ISR)
{
int i=0;
char temp;
int temp1;
if (IRQ_DMA7 == (IRQ_DMA7 & *pSIC_ISR))
{
//Interrupt source is IRQ_DMA7 (UART RX)
temp1=*pSIC_ISR;
temp1=IRQ_DMA7;
//p11-17 :DMA interrupt routines must explicitly write 1 to the corresponding DMA_IRQ_STATUS registers to clear the latched request of the pending interrupt.
*pDMA7_IRQ_STATUS = 1;

for (i=0;i<4;i++)
{
temp=RXbuf[i];
//TXbuf[i]=temp;
}
flag=1;
}
else
{
if(IRQ_DMA8 == (IRQ_DMA8 & *pSIC_ISR))
{
//Interrupt source is IRQ_DMA8 (UART TX)

//p11-17 :DMA interrupt routines must explicitly write 1 to the corresponding DMA_IRQ_STATUS registers to clear the latched request of the pending interrupt.
*pDMA8_IRQ_STATUS = 1;
if (flag==1)
{
flag=0;
TXbuf[0]=111;
TXbuf[1]=107;
TXbuf[2]=33;
TXbuf[3]=33;
}
}
}

}

在main里调用init_uart(baudrate)就可以开始发送数据了。

现在的问题是:

每次接收4个byte之后,可以准确地触发中断,但是查看buffer里的数据,永远是 0xff, 0xff, 0x0, 0x0。

请高手帮看一下哪里出问题了,谢谢!

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/10/9 19:37:37
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

硬件平台是? 纯贴代码很难判断,没人能通读你的代码的。技术问题的提问方式可借鉴OP的一个帖子。

http://www.openadsp.com/bbs/Topic.asp?id=793&BoardID=3&TB=1


我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/10/9 19:47:19
Runner(论坛新手)
Runner
头衔:社区公民
帮派:无帮无派
帖数:29
金钱:332
积分:36
注册时间:2012/10/9
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
不好意思!帖子上没说清楚!

硬件平台是贵司的edu-bf592开发板,软件平台是vdsp++ 5,仿真器是贵司的510ICE。



这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/10/9 19:52:59
Runner(论坛新手)
Runner
头衔:社区公民
帮派:无帮无派
帖数:29
金钱:332
积分:36
注册时间:2012/10/9
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个程序很简单,就是设置一下DMA和UART,使用4单元的char数组充当dma的发送和接收缓存。

然后我用hyperterminal连接到comport上,开始输入1234,或者abcd,每当接收到4个byte之后,程序就进入中断了,直到这里还是非常符合程序设计的,但在中断服务函数里,我循环读取接收缓存,但不论我输入的是什么,接收缓存里的数据永远是 0xff, 0xff, 0x0, 0x0。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/10/9 19:56:16
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你的IO口有配置成UART吗?

我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/10/9 20:24:46
Runner(论坛新手)
Runner
头衔:社区公民
帮派:无帮无派
帖数:29
金钱:332
积分:36
注册时间:2012/10/9
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
有的,配置代码是:

void Init_gpio(void)
{
//p7-3: Port F & Port G Multiplexing Scheme. Multi-Function is controlled by the PORTF_MUX and PORTF_FER registers.

//p7-22: Function Enable Registers (PORTx_FER)
//For all bits, 0 - GPIO mode, 1 - Enable peripheral function
*pPORTF_FER |= PF11 | PF12 ; //ÅäÖÃPF11,PF12ÎaìØêa1|Äü½Å
//p7-21: Port Multiplexer Control Register (PORTx_MUX)
//For all bit fields: 0 = Peripheral function, 1 = Alternate peripheral function
*pPORTF_MUX &= ~(PF11 | PF12 );//ÅäÖÃPF11,PF12ÎaUART½ó¿ú¡£

//p7-22: Function Enable Registers (PORTx_FER)
//For all bits, 0 - GPIO mode, 1 - Enable peripheral function
*pPORTG_FER &= (~(PG0 | PG1 | PG2 | PG3));
//p7-22: GPIO Direction Registers (PORTxIO_DIR)
//For all bits, 0 - Input, 1 - Output
*pPORTGIO_DIR |= (PG0 | PG1 | PG2 | PG3);
}


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/10/9 20:30:36
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
看不出来,没搞过...

我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/10/9 20:59:55
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154109 Call, 1 Queries, Processed in 0.039063 second(s),