arm2009wzm 发表于 2013-6-25 16:04

2440的SPI通过DMA接收AD7766数据

S3C2440用SPI的查询方式已经接收到AD7766的数据,因为SPI一次只接收8位,而AD7766为24位AD,所以分3次读数,现在要把它改成SPI通过DMA(暂时用查询)来连续读取三次数据到RAM中,但不知为什么,在RAM中一直没有AD数据。
现将程序的设置如下,各位帮忙指点一下:

//*************************************************************************************************
// SPI接口初始化
void SPI_Init()
{
   rSPPRE1= 0x4;         // 设置波特率预分频器值N,BaudRate = PCLK/2/(N+1)
   rSPCON1 &= ~0x66;    // CPOL=0,CPHA=0,方式1传输 (格式A,极性为正)
   rSPCON1 |= 0x59;       // 用0x59或者0x41好像没有什么差别
}
//*************************************************************************************************
// DMA通道3用于和SPI1通讯,接口初始化
void DMA_Init()
{
   rDISRC3= 0x59000034;   // DMA 初始源地址为SPI1的接收寄存器 rSPRDAT1
   rDISRCC3 = 0x3;                  // 源在外设总线APB上,地址固定
   rDIDST3= 0x33000000;   // 初始目标地址
   rDIDSTC3 = 0x0;                  // TC=0时中断,目标在系统总线AHB上,地址增加
   rDCON3   = 0x82800003;   // 握手、同步到APB、中断、硬件源SPI1、自动重加载、3字节
}
//*************************************************************************************************
// ADC 调试,使用DMA方式通过SPI读取24位AD
void ADC_Ts()
{
   while(1)
   {
         while ((rGPFDAT & 0x1) == 0x00);   // READ低等待
         while ((rGPFDAT & 0x1) == 0x01);   // READ高等待
         rSPCON1 |= 0x1;                               // SPI 的 TAGD=1,在接收数据时先自动发送杂数据
         rSPTDAT1 = 0xff;                               // 输出接收第一个字节的时钟,此行没有好像没关系
         rDMASKTRIG3 = 0x2;                         // DMASKTRIGn(ON_OFF) = 1: ON,打开DMA通道
         while ((rDSTAT3 & 0xfffff) !=0);          // 判断DMA的计数是否为0,不是则等待
         rSPCON1 &= ~0x1;                           // SPI不自动发送杂数据
         rDMASKTRIG3 = 0x4;                        // 停止DMA
         Delay(1000);                                     // 设置断点,观察数据
    }
}

//**************************************************************************************************
// 用示波器监视SPI1的SCK引脚,执行上面的调试程序时,发现3个8位的时钟脉冲,观看RAM区,SPRDAT1也有数据变化,通过
// 和SPI查询方式读数比较,此时SPRDAT1(0x59000034)数据也正确。
// 但是不知为什么,DMA的目标地址0x33000000中就是没有数据变化,也就是说DMA的源地址数据就是传输不到目标地址中。

arm2009wzm 发表于 2013-7-1 09:34

有没有知道的前辈帮忙回答一下啊?

airwill 发表于 2013-7-2 13:03

这个芯片没有用过.
数据不传输, 想必是设置不对吧
是不是有允许位, 或者触发没有设置好呢

arm2009wzm 发表于 2013-7-8 09:12

已经解决了。
主要是数据Cache和DMA发生了内存冲突,只要关闭DMA所使用的RAM对应的数据Cache就可以正常收到数据了
页: [1]
查看完整版本: 2440的SPI通过DMA接收AD7766数据