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的源地址数据就是传输不到目标地址中。
|