UART接口定义为DMA模式接收数据

转载 2012年05月03日 09:18:42
问题是这样:我把BF533的UART接口定义为DMA模式接收数据,但是接收到的数据总是零. 我不知道是不是我的配置有问题. 
  请高手指点一下.多谢. 配置如下:
void Init_DMA(void)
{
    *pDMA6_PERIPHERAL_MAP = 0x6000;
    *pDMA6_CONFIG = WDSIZE_8 |DI_EN ; (传输大小为字节 | 接收完成产生中断)
    *pDMA6_X_COUNT = 0xa; (大小为10个字节的buffer)
    *pDMA6_X_MODIFY = 1;
}

main()
{
   unsigned char rec_buffer[10];
   Init_DMA( );
  
   .......
   *pDMA6_START_ADDR = (unsigned char *)rec_buffer; (DMA的开始地址)
   *pDMA6_CONFIG = (*pDMA6_CONFIG | DMAEN); (DMA使能)
   *pUART_IER = 0x1;  (第一次,请求数据)
   while(*pDMA6_IRQ_STATUS&0x8); (等待完成)
   ............
}

通过超级终端给BF533发数据,无论键入什么字符,当DMA完成后,查看数组rec_buffer的值.全都是零..不知道是为什么.

请高手指点一下! 谢谢~

-------------------------------------------------------------------------------

注意每句MMR赋值语句后面要加入ssync

-------------------------------------------------------------------------------

都加了SSYNC后,调试还是收不到数据.

我在每句Memory-mapped Registers操作的语句后面都加了SSYNC语句.调试,还是不行.不知道为什么.

单步到while(*pDMA6_IRQ_STATUS&0x8);  通过串口给blackfin输入10个字符后,就能跳出这个while循环,按理应该收到了数据才对.但是读那个数组,却全都是0.不知道为什么.

请大家给点意见啊~  谢谢~

-------------------------------------------------------------------------------

VDSP里面有UART通信的例子的

在安装目录的samples里面,听听ADI的那个视频教程

-------------------------------------------------------------------------------

 我搜了一下,在我的安装路径下面找不到你说的例子程序.有两个samples文件夹,但是不是blackfin处理器的.我也进去看了一下.里面的代码没有设计到UART.  

   我的VisualDSP的版本是4.0的.不知道是不是我们的版本不一样.所以没有找到呢?

    我试过把UART配置成DMA发送的模式,通过串口打印.就可以实现.但是用UART来接收数据,却总是零. 还是没有找到什么地方出现问题了.郁闷~~

 

-------------------------------------------------------------------------------

配置DMA没必要加ssync();
你的DMA应该是配置成AUTOBUFFER模式的吧?既然使能了中断为什么还用
while(*pDMA6_IRQ_STATUS&0x8);呢?
程序好像有点乱,建议搭建一个正规的框架,DMA中断加不加无所谓,使能DMA一次后就不用再使能了,使能UART前先使能DMA

-------------------------------------------------------------------------------

VDSP里面确实没有c语言的DMA模式UART范例,还是我来给你吧
/*Headerfile declarations*/
#include <cdefbf533.h>
#include <signal.h>
#include <stdio.h>
#include <sys/exception.h>
#include <sys/excause.h>

/* Input CLK frequency */
#define CLKIN 27000000 // 27 MHz

/* UART Baud Rate Selection */
#define BAUD_RATE 115200 // 115.2 Kbps
//#define BAUD_RATE 921600 // 921.6 Kbps

typedef signed char int8_t;
typedef short int16_t;
typedef long int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;

#define TXLEN 256

#define RXLEN 2560

#define ssync() asm("ssync;")

EX_INTERRUPT_HANDLER(Uart_Dma_Isr_Tx);
EX_INTERRUPT_HANDLER(Uart_Dma_Isr_Rx);

void Init_Interrupts();
void Init_Dma_Tx();
void Init_Dma_Rx();
void Init_Uart();

/*Buffers*/
unsigned char AutobufferTx[TXLEN]={
#include"data.dat"
};
unsigned char AutobufferRx[RXLEN];


void main()
{

Init_Interrupts();
Init_Dma_Tx();
Init_Dma_Rx();
Init_Uart();

while(1)
{
asm("nop;");
}

}
void Init_Interrupts()
{
*pSIC_IAR1 = 0x34666666;//DMA6(uartrx),
//DMA7(uarttx)
ssync();

register_handler(ik_ivg10, Uart_Dma_Isr_Tx);
register_handler(ik_ivg11,Uart_Dma_Isr_Rx);

*pSIC_IMASK = 0x0000c000;//DMA6(uartrx) & DMA7(uarttx)
ssync();
}

/*Transmit isr*/
EX_INTERRUPT_HANDLER(Uart_Dma_Isr_Tx)
{
/* Clear Transmit Interrupt */
*pDMA7_IRQ_STATUS = 0x3;
ssync();
}

/*Receive isr*/
EX_INTERRUPT_HANDLER(Uart_Dma_Isr_Rx)
{
/* Clear Receive Interrupt */
*pDMA6_IRQ_STATUS = 0x3;
ssync();
}

/*Uart Tx init*/
void Init_Dma_Tx()
{
int Ttemp;

*pDMA7_CONFIG=0x1080; /* Ena autobuff,linear block,8bit,Source */
ssync();

*pDMA7_PERIPHERAL_MAP=0x7000;/*UART-TX*/
ssync();

*pDMA7_X_COUNT = TXLEN;
ssync();

*pDMA7_X_MODIFY = 1;/*Linear*/
ssync();

*pDMA7_Y_COUNT = 0;
ssync();

*pDMA7_Y_MODIFY = 0;
ssync();

/* enable sport0_dma_start_hi_addr */
*pDMA7_START_ADDR = AutobufferTx;
ssync();

Ttemp = *pDMA7_CONFIG;
*pDMA7_CONFIG=(Ttemp|0x01);/*Enable DMA*/
//*pDMA7_CONFIG=0x1081;
ssync();
}

/*Uart rx init*/
void Init_Dma_Rx()
{
int Ttemp;

*pDMA6_CONFIG=0x1082; /* Ena autobuff,linear block,8bit,Destination */
//*pDMA6_CONFIG=0x1052;testing

ssync();

*pDMA6_PERIPHERAL_MAP=0x6000;/*UART-RX*/
ssync();

*pDMA6_X_COUNT = RXLEN;//LEN;
ssync();

*pDMA6_X_MODIFY = 1;/*Linear*/
ssync();

*pDMA6_Y_COUNT = 0;
ssync();

*pDMA6_Y_MODIFY = 0;
ssync();

/* enable sport0_dma_start_hi_addr */
*pDMA6_START_ADDR = AutobufferRx;
ssync();

Ttemp = *pDMA6_CONFIG;
*pDMA6_CONFIG=(Ttemp|0x01);/*Enable DMA*/
//*pDMA7_CONFIG=0x1083;
ssync();
}

 


/*Uart driver initialization*/
void Init_Uart()
{
uint32_t divisor; // Uses to hold the calculated divisor value
uint8_t msel; // Multiplier MSEL[5:0] of PLL_CTL register[14:9]
uint8_t ssel; // Divisor SSEL[3:0] of PLL_DIV register[3:0]

/* Line Control Setup : 8-bit data, no parity, 1 stop bit */
*pUART_LCR = 0x0083;


/* Read the MSEL from PLL_CTL register */

msel = (*pPLL_CTL)>>9; // Read MSEL[5:0] from PLL_CTL
msel &= 0x3F; // Clear all bits except msel[5:0]

/* Read SSEL from PLL_DIV register */
ssel = *pPLL_DIV;
ssel &= 0x0F; // Clear all bits except ssel[3:0]

/* divisor calculation:
* SCLK = (msel * CLKIN)/ssel if DF = 0
* SCLK = (msel * CLKIN/2)/ssel if DF = 1
* divisor = SCLK/(16 * BAUD_RATE)
*/
divisor = ((msel * CLKIN)/(ssel * 16 * BAUD_RATE));

if(*pPLL_CTL & 0x1) // If DF = 1, CLKIN/2 is going to PLL
{
divisor /= 2; // Divide by 2
}

/* Baud Rate Setup: 115.2 Kbps */
*pUART_LCR |= DLAB; // Enable Divisor Latch Access
*pUART_DLL = divisor;
ssync();
*pUART_DLH = (divisor>>8);
ssync();
*pUART_LCR &= ~DLAB;// Disable Divisor Latch Access
ssync();

*pUART_IER =0x3;//Enable interrupts for receive & transmit

//*pUART_IER =0x2;//Enable interrupts for transmit

//*pUART_IER =0x1;//Enable interrupts for receive

ssync();
*pUART_GCTL = UCEN;/*UART Clock enable*/
ssync();

}

-------------------------------------------------------------------------------

非常感谢楼上各位的指导,在调试了oppop的代码后,坚信硬件没有问题后,对比了一下oppop的代码.原来我把DMA的方向设置反了.晕.....非常感谢各位的帮助

STM32的UART DMA传输总结

使用DMA传输可以连续获取或发送一段信息而不占用中断或延时,在通信频繁或有大段信息要传输时非常有用。 由上表可知,要使用USART1TX/RX我们选择通道4和5 1、 DMA传输方式: (1...
  • u011388550
  • u011388550
  • 2016年05月28日 13:38
  • 4735

uart dma实现方式分析

uart dma实现方式分析(转载) 在做uart DMA驱动期间,前后加起来也有1个月左右的时间,总的来说比较全面的了解了uart,DMA的工作原理。 在调试中,遇到了最大问题就是关于DMA...
  • haozi0_0
  • haozi0_0
  • 2015年12月07日 15:19
  • 2902

uart dma实现方式分析

转载地址:http://blog.csdn.net/yinkaizhong/archive/2009/02/25/3936055.aspx在做uart DMA驱动期间,前后加起来也有1个月左右的时间,...
  • yimu13
  • yimu13
  • 2011年04月22日 09:46
  • 2167

STM32CubeMX:UART(DMA空闲方式)

UART传输有三种方式,而DMA的应用采用阻塞式接收指定的数据长度,效率较低,而应用DMA空闲方式可提高其效率。 参考帖子:http://blog.csdn.net/youmeichifan/art...
  • anchises
  • anchises
  • 2017年04月17日 10:44
  • 1539

STM32CubeMX 串口空闲中断加DMA 实现不定长度收发数据

STM32CubeMX串口空闲中断+DMA实现不定长度收发数据,实现过程
  • mjfmjj
  • mjfmjj
  • 2016年06月24日 11:03
  • 10771

EFM32片内外设--DMA之LeUart Tx Rx

一直没有具体的自己写过和测试过DMA+LeUart的功能。只是知道EFM32针对LeUart做了很多的优化。例如在EM2的情况下,无论是发送还是接收,都可以自动唤醒DMA,进行传输,大大的降低了整个板...
  • EFM32
  • EFM32
  • 2012年08月07日 23:49
  • 4981

AXI DMA调试过程记录

1. 补充前面写过的一篇博客关于Zynq的uart的使用   今天发现一个很奇怪的现象,就是当只是用PS时,用uart1不需约束引脚就ok(上篇已提),但当使用了PL部分时,如果只使用了uart1,...
  • yang2011079080010
  • yang2011079080010
  • 2016年06月29日 15:48
  • 1494

STM32F103 UART4 DMA接收 终于调试成功,分享一下

//网上找了老半天也找不到UART4-DMA的程序,自己调试成功了,特地分享一下 uint8_t UART4_Rx_buffer[512],UART4_Rx_num;void UART4_Config...
  • a15951837025
  • a15951837025
  • 2015年11月25日 10:39
  • 6653

EFM32G UART 接收方向的 DMA+FIFO 处理方式

通过 DMA 方式接收数据,可以最大限度地节省处理器资源,避免了频繁的 UART 接收中断开销。FIFO 是数据接收、解析中常见的一种数据结构,它可以有效地隔离数据接收、解析之间的耦合关系,简化处理方...
  • glen_lara
  • glen_lara
  • 2013年08月20日 11:27
  • 1213

zstack协议中UART的两种模式

http://wjf88223.blog.163.com/blog/static/3516800120104179327286/   协议栈中UART有两种模式: 1、中断 2、DMA 对于...
  • tanqiuwei
  • tanqiuwei
  • 2012年11月14日 15:03
  • 3122
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UART接口定义为DMA模式接收数据
举报原因:
原因补充:

(最多只允许输入30个字)