Написал программку под lpc2378 NXP для передачи данных по SSP интерфейсу с использованием DMA. Пользовался IDE mVision keil 3. Все прекрасно работает. В дальнейшем переполз на keil4 и тогда программа начала зависать. Стал гонять в симуляторе, выяснил что ругается на доступ к адресам USB памяти (*** error 65: access violation at 0x7FD00000 : no 'write' permission), сравнил hex прошивки от 3 и 4 версии они абсолютно разные.
Код программы:
Код
#include <LPC23xx.H>
#include <math.h>
#define DMA_SRC 0x7FD00000
#define DMA_DST 0xE0068008
#define DATA_BUFFER 0x7FE00000
#define swap(a,b){a+=b;b=a-b;a-=b;}
#include "pll.h"
#include "ssp.h"
#include "uart.h"
#include "irq.h"
#include "model.h"
extern TICK _TICKS;
extern STATE _STATE;
extern ushort CRC;
extern volatile ulong UART0Count;
extern volatile byte UART0Buffer[UART0_BUFSIZE];
extern volatile uint IFLAG;
int main (void){
short i;
ushort data[GROUP_SIZE];//(ushort*)0x7FE00000;
ulong buf,subbuf;
// uint *src_addr;
uint* buf1=(uint*)DMA_SRC; //[DMA_SIZE];
uint* buf2=(uint*)(DMA_SRC)+GROUP_SIZE; //[DMA_SIZE];
CCLKCFG = 4;
SCS=1<<5;
//источник тактирования RTC
CLKSRCSEL = 2;
init_pll(15869,3);
PINSEL0 |= 0xC0000000;
PINSEL1 |= 0x00000028;
IODIR0|=1<<10;
IOCLR0|=1<<10;
//-----MAM---------
init_ssp();
//Подготвка данных очистка памяти для групп
for ( i = 0; i < GROUP_SIZE; i++ ) {
buf1[i]=0; //тут происходит обращение к памяти USB и возникает ошибка
buf2[i]=0;
data[i]=i;//101*(cos(i/57.3)+1);
}
clear_state();
clear_tick();
//clear_group(buf1);
//clear_group(buf2);
make_group((uint*)buf1);
PCONP |= (1 << 29); // Enable GPDMA clock
buf=(ulong)buf1;
subbuf=(ulong)buf2;
GPDMA_CONFIG=3;
while ( !(GPDMA_CONFIG & 0x1) );
GPDMA_CH0_DEST= DMA_DST;
GPDMA_INT_TCCLR = 0x01;
GPDMA_INT_ERR_CLR = 0x01;
IOCLR0|=1<<10;
while(1){
//получим данные по uart запишем их в data
ulong addr_stop=buf+4096;
GPDMA_CH0_SRC = buf;
GPDMA_CH0_CTRL = (1024) | (0x04 << 12) | (0x03 << 15)|(2<<18)|(1<<21)| (1 << 26)|(1<<31);
GPDMA_CH0_CFG |= (0x05 << 11)|(0x01)|(0x0 << 6)|(15<<1)|(14<<1);
IOSET0=1<<10;
clear_group((uint*)subbuf);
//Crc16(data,1024);
make_data((uint*)subbuf,data);
make_group((uint*)subbuf);
swap(subbuf,buf);
IOCLR0|=1<<10;
//while(GPDMA_RAW_INT_TCSTAT==0);
while(GPDMA_CH0_SRC<addr_stop);
GPDMA_INT_TCCLR = 0x01;
GPDMA_INT_ERR_CLR = 0x01;
}
return 0;
}