Hi, ich entwickel derzeit fuer eine Firma ein System welches einen Spartan6 LX45 und einen AT91SAM7X256 Controller beinhaltet. Beide sind ueber JTAG angebunden. Die Konfiguration des Controllers erfolgt dabei ueber OpenOCD. Das Beschreiben des Controller Flashs funktioniert. Das Problem ist, dass nach der Konfiguration alle IO Pins High Level (3,3V) fuehren. Egal welches Programm auf den Controller geladen wird. Die Initialisierung (LowLevelInit) ist soweit "standard", also die die auch von Atmel zur Verfuegung gestellt wird. Ebenso das OpenOCD Script. Die Beschaltung des Controllers ist soweit auch nicht ungewoehnlich (siehe Anhang). Was ich bereits geprueft habe sind die Versorgungsspannungspegel (3,3V und 1,8V), diese sind genau so wie sie sein sollten, Kurzschluesse habe ich soweit ausgeschlossen. Des weiteren habe ich den Quarz vermessen. Dieser schwingt mit 18,432MHz mit einer Amplitude von ca. 250mV, allerdings mit einem leichten DC Offset. Koennte bereits das dieses Problem verursachen? So langsam bin ich am Verzweifeln. Meine Annahme ist, dass der Controller vielleicht defekt ist, allerdings moechte ich wirklich alles ausschliessen bevor ich mich ans Umloeten mache. Waere super wenn Jemand mit mehr Erfahrung mit ARM Controllern mir einen Rat geben koennte.
Ich kenne mich an der Low-Level-Front jetzt auch nicht wirklich aus, aber köntest du nicht einfach mal ein einfaches "Blinke"-Skript per Samba draufspielen? Die kostenfreie Keil-Version dazu vielleicht verwenden, damit kannst du ein paar Kbyte Programmcode in deinen AT91 schubsen. Siehst du den an der Debug-Schnittstelle das Romboot?
Danke fuer die Antwort. Ich habe bisher noch nie SAM-BA benutzt. Vor einem Jahr habe ich bereits mit einem AT91SAM7 gearbeitet, damals allerdings auf einer nicht selbst entwickelten Leiteprlatte. Habe immer direkt ueber JTAG programmiert. Die Entwicklungsumgebung war die selbe wie jetzt (selber Rechner). Soweit ich gelesen habe erforder samba auch eine Beschaltung die ich nicht implementiert Die Meldungen der Kofiguration sehen wie folgt aus:
1 | **** Build of configuration Default for project pcb_fw **** |
2 | |
3 | make -k program |
4 | Preparing OpenOCD script... |
5 | Flash Programming with OpenOCD... |
6 | 'C:\OpenOCD\OpenOCD\'openocd-libftdi.exe -f 'C:\OpenOCD\OpenOCD\'olimex-arm-usb-tiny-h.cfg -f 'C:\OpenOCD\OpenOCD\'at91sam7x256.cfg |
7 | Open On-Chip Debugger 0.4.0 (2010-11-23-14:20) |
8 | Licensed under GNU GPL v2 |
9 | For bug reports, read |
10 | http://openocd.berlios.de/doc/doxygen/bugs.html |
11 | srst_only srst_pulls_trst srst_gates_jtag srst_open_drain |
12 | jtag_nsrst_delay: 100 |
13 | jtag_ntrst_delay: 100 |
14 | 10000 kHz |
15 | Info : max TCK change to: 30000 kHz |
16 | Info : clock speed 10000 kHz |
17 | Info : JTAG tap: Spartan_6.cpu tap/device found: 0x44008093 (mfg: 0x049, part: 0x4008, ver: 0x4) |
18 | Info : JTAG tap: sam7x256.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) |
19 | Info : Embedded ICE version 1 |
20 | Info : sam7x256.cpu: hardware has 2 breakpoint/watchpoint units |
21 | Info : JTAG tap: Spartan_6.cpu tap/device found: 0x44008093 (mfg: 0x049, part: 0x4008, ver: 0x4) |
22 | Info : JTAG tap: sam7x256.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) |
23 | Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset. |
24 | target state: halted |
25 | target halted in Thumb state due to debug-request, current mode: Supervisor |
26 | cpsr: 0x600000b3 pc: 0x00200b02 |
27 | Warn : NOTE! DCC downloads have not been enabled, defaulting to slow memory writes. Type 'help dcc'. |
28 | Warn : NOTE! Severe performance degradation without fast memory access enabled. Type 'help fast'. |
29 | cleared protection for sectors 0 through 15 on flash bank 0 |
30 | at91sam7 gpnvm <bit> <set | clear> |
31 | #0 : at91sam7 at 0x00100000, size 0x00040000, buswidth 4, chipwidth 0 |
32 | # 0: 0x00000000 (0x4000 16kB) not protected |
33 | # 1: 0x00004000 (0x4000 16kB) not protected |
34 | # 2: 0x00008000 (0x4000 16kB) not protected |
35 | # 3: 0x0000c000 (0x4000 16kB) not protected |
36 | # 4: 0x00010000 (0x4000 16kB) not protected |
37 | # 5: 0x00014000 (0x4000 16kB) not protected |
38 | # 6: 0x00018000 (0x4000 16kB) not protected |
39 | # 7: 0x0001c000 (0x4000 16kB) not protected |
40 | # 8: 0x00020000 (0x4000 16kB) not protected |
41 | # 9: 0x00024000 (0x4000 16kB) not protected |
42 | # 10: 0x00028000 (0x4000 16kB) not protected |
43 | # 11: 0x0002c000 (0x4000 16kB) not protected |
44 | # 12: 0x00030000 (0x4000 16kB) not protected |
45 | # 13: 0x00034000 (0x4000 16kB) not protected |
46 | # 14: 0x00038000 (0x4000 16kB) not protected |
47 | # 15: 0x0003c000 (0x4000 16kB) not protected |
48 | |
49 | at91sam7 driver information: Chip is AT91SAM7X256 |
50 | Cidr: 0x275b0942 | Arch: 0x0075 | Eproc: ARM7TDMI | Version: 0x002 | Flashsize: 0x00040000 |
51 | Master clock (estimated): 48054 KHz | External clock: 18432 KHz |
52 | Pagesize: 256 bytes | Lockbits(16): 0 0x0000 | Pages in lock region: 0 |
53 | Securitybit: 0 | Nvmbits(3): 0 0x0 |
54 | |
55 | dcc downloads are enabled |
56 | fast memory access is enabled |
57 | background polling: on |
58 | TAP: sam7x256.cpu (enabled) |
59 | target state: halted |
60 | target halted in Thumb state due to debug-request, current mode: Supervisor |
61 | cpsr: 0x600000b3 pc: 0x00200b02 |
62 | flash 'at91sam7' found at 0x00100000 |
63 | auto erase enabled |
64 | auto unlock enabled |
65 | wrote 229376 bytes from file main.BIN in 28.546875s (7.847 kb/s) |
66 | Info : JTAG tap: Spartan_6.cpu tap/device found: 0x44008093 (mfg: 0x049, part: 0x4008, ver: 0x4) |
67 | Info : JTAG tap: sam7x256.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) |
68 | background polling: on |
69 | TAP: sam7x256.cpu (enabled) |
70 | target state: running |
71 | background polling: on |
72 | TAP: sam7x256.cpu (enabled) |
73 | target state: running |
74 | shutdown command invoked |
75 | Flash Programming Finished. |
Der Flash wird also gefunde nund auch beschrieben... Resultierend aus meinem OpenOCD Configurations Script:
1 | #use combined on interfaces or targets that can't set TRST/SRST separately |
2 | reset_config srst_only srst_pulls_trst #srst_gates_jtag srst_open_drain none separate |
3 | #jtag init |
4 | if { [info exists CHIPNAME] } { |
5 | set _CHIPNAME $CHIPNAME |
6 | } else { |
7 | set _CHIPNAME sam7x256 |
8 | } |
9 | |
10 | if { [info exists ENDIAN] } { |
11 | set _ENDIAN $ENDIAN |
12 | } else { |
13 | set _ENDIAN little |
14 | } |
15 | |
16 | if { [info exists CPUTAPID] } { |
17 | set _CPUTAPID $CPUTAPID |
18 | } else { |
19 | |
20 | #set _CPUTAPID 0x44008093 |
21 | set _CPUTAPID 0x3f0f0f0f |
22 | } |
23 | |
24 | #adapter_nsrst_delay 100 |
25 | jtag_nsrst_delay 100 |
26 | jtag_ntrst_delay 100 |
27 | jtag_khz 10000 |
28 | |
29 | #jtag init |
30 | |
31 | #jtag newtap Spartan_6 cpu -irlen 6 -ircapture 0x9 -irmask 0x3f -expected-id 0x44008093 |
32 | jtag newtap Spartan_6 cpu -irlen 6 -ircapture 0x1 -irmask 0xf -expected-id 0x44008093 |
33 | jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID |
34 | #jtag newtap AAA cpu -irlen 32 -ircapture 0x1 -irmask 0x3 -expected-id $_CPUTAPID |
35 | |
36 | |
37 | |
38 | set _TARGETNAME $_CHIPNAME.cpu |
39 | target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi |
40 | |
41 | |
42 | |
43 | $_TARGETNAME configure -event reset-init { |
44 | # disable watchdog |
45 | mww 0xfffffd44 0x00008000 |
46 | # enable user reset |
47 | mww 0xfffffd08 0xa5000001 |
48 | # CKGR_MOR : enable the main oscillator |
49 | mww 0xfffffc20 0x00000601 |
50 | sleep 10 |
51 | # CKGR_PLLR: 96.1097 MHz |
52 | mww 0xfffffc2c 0x00481c0e |
53 | sleep 10 |
54 | # PMC_MCKR : MCK = PLL / 2 ~= 48 MHz |
55 | mww 0xfffffc30 0x00000007 |
56 | sleep 10 |
57 | # MC_FMR: flash mode (FWS=1,FMCN=60) |
58 | mww 0xffffff60 0x00480100 |
59 | sleep 100 |
60 | } |
61 | |
62 | |
63 | # this procedure writes an image file to the processor |
64 | # edit the name of the file!! |
65 | proc program_device () { |
66 | # halt the processor |
67 | halt |
68 | wait_halt |
69 | |
70 | # write file to flash memory |
71 | arm7_9 dcc_downloads enable |
72 | arm7_9 fast_memory_access enable |
73 | sleep 10 |
74 | poll |
75 | flash probe 0 |
76 | #flash write_image erase unlock "AT91SAM7_H256.BIN" 0x00100000 |
77 | |
78 | flash write_image erase unlock "main.BIN" 0x00100000 |
79 | sleep 100 |
80 | |
81 | #start execution of the program just downladed |
82 | reset run |
83 | sleep 10 |
84 | |
85 | #exit OpenOCD |
86 | #shutdown |
87 | } |
88 | |
89 | |
90 | |
91 | $_TARGETNAME configure -work-area-phys 0x00200000 -work-area-size 0x4000 -work-area-backup 0 |
92 | |
93 | #flash bank <driver> <base_addr> <size> <chip_width> <bus_width> <target_number> [<target_name> <banks> <sectors_per_bank> <pages_per_sector> <page_size> <num_nvmbits> <ext_freq_khz>] |
94 | set _FLASHNAME $_CHIPNAME.flash |
95 | flash bank $_FLASHNAME at91sam7 0 0 0 0 $_TARGETNAME 0 0 0 0 0 0 0 18432 |
96 | |
97 | init |
98 | reset init |
99 | flash protect 0 0 15 off |
100 | at91sam7 gpnvm 0 2 set |
101 | flash info 0 |
102 | |
103 | sleep 1000 |
104 | |
105 | #soft_reset_halt |
106 | program_device () |
107 | |
108 | poll |
109 | sleep 1000 |
110 | poll |
111 | shutdown |
Die LowlevelInit ist diese hier:
1 | #include "MainHeader.h" |
2 | |
3 | |
4 | // ----------------------------------------------------------------------------
|
5 | // ATMEL Microcontroller Software Support - ROUSSET -
|
6 | // ----------------------------------------------------------------------------
|
7 | // The software is delivered "AS IS" without warranty or condition of any
|
8 | // kind, either express, implied or statutory. This includes without
|
9 | // limitation any warranty or condition with respect to merchantability or
|
10 | // fitness for any particular purpose, or against the infringements of
|
11 | // intellectual property rights of others.
|
12 | // ----------------------------------------------------------------------------
|
13 | // File Name : Cstartup_SAM7.c
|
14 | // Object : Low level initializations written in C for IAR tools
|
15 | // 1.0 08/Sep/04 JPP : Creation
|
16 | // 1.10 10/Sep/04 JPP : Update AT91C_CKGR_PLLCOUNT filed
|
17 | // ----------------------------------------------------------------------------
|
18 | |
19 | |
20 | // The following functions must be written in ARM mode - they are called directly by exception vector
|
21 | extern void AT91F_Spurious_handler(void); |
22 | extern void AT91F_Default_IRQ_handler(void); |
23 | extern void AT91F_Default_FIQ_handler(void); |
24 | |
25 | //*----------------------------------------------------------------------------
|
26 | //* \fn AT91F_LowLevelInit
|
27 | //* \brief This function performs very low level HW initialization
|
28 | //* this function can be use a Stack, depending the compilation
|
29 | //* optimization mode
|
30 | //*----------------------------------------------------------------------------
|
31 | |
32 | void LowLevelInit(void) |
33 | {
|
34 | int i; |
35 | AT91PS_PMC pPMC = AT91C_BASE_PMC; |
36 | |
37 | // Set Flash Wait state to 1
|
38 | // MCLK = 48054857.14 -> 72.08 -> use: 73 cycles per 1.5 us
|
39 | AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(73 << 16)) | AT91C_MC_FWS_1FWS; |
40 | |
41 | |
42 | // watchdog:
|
43 | // AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; // Disable Watchdog
|
44 | |
45 | AT91C_BASE_WDTC->WDTC_WDMR= 0x11FF21FF; // watchdog enabled (halted in debug) |
46 | // interval -> about 2s
|
47 | |
48 | AT91C_BASE_WDTC->WDTC_WDCR=0xA5000001; //reset wd |
49 | |
50 | |
51 | // Enable the Main Oscillator:
|
52 | // fstart = 32.768kHz -> Start up time = 8 * 100 / fstart = 800 / 32.768e3 = 24.41 ms
|
53 | pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x64 << 8) | AT91C_CKGR_MOSCEN )); |
54 | |
55 | // Wait the startup time:
|
56 | while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); |
57 | |
58 | // PMC Clock Generator PLL setup:
|
59 | // DIV = 14, (MUL+1) = 73, PLLCOUNT = 10, OUT = 0 (not used)
|
60 | pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 14) | |
61 | (AT91C_CKGR_PLLCOUNT & (10<<8)) | |
62 | (AT91C_CKGR_MUL & (72<<16))); //Actual Mult Factor = MUL + 1 !!!!!!!! |
63 | |
64 | // Wait the startup time (until PMC Status register LOCK bit is set)
|
65 | while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); |
66 | |
67 | // PMC Master Clock (MCLK) setup
|
68 | // The PMC_MCKR register must not be programmed in a single write operation!!
|
69 | // if PLLCLK then first: PRES then CSS - wait for MCKRDY everytime!
|
70 | // CSS = 3 (PLLCK), PRES = 1 (MCLK=PLLCK/2) = 48054857.14 Hz
|
71 | |
72 | pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; |
73 | while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Wait for MCKRDY |
74 | pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_2; |
75 | while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Wait for MCKRDY |
76 | |
77 | // Set up the default interrupt handler vectors
|
78 | AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler; |
79 | for (i=1;i <= 31; i++) |
80 | {
|
81 | AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler; |
82 | }
|
83 | AT91C_BASE_AIC->AIC_SPU = (int) AT91F_Spurious_handler; |
84 | |
85 | |
86 | AT91C_BASE_AIC->AIC_ICCR = 0xFFFFFFFF; // Clear all interrupts |
87 | AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; // Disable all interrupts |
88 | |
89 | AT91C_BASE_RSTC->RSTC_RMR = (((unsigned int) 0xA5 << 24) | AT91C_RSTC_URSTEN ); // allow user reset |
90 | |
91 | //enable clocks for pioa and piob
|
92 | pPMC->PMC_PCER = (1<<AT91C_ID_PIOA); |
93 | pPMC->PMC_PCER = (1<<AT91C_ID_PIOB); |
94 | |
95 | }
|
Ich weiss das es viel Code zum durchsehen ist. Waere wirklich nett wenn jemand sich das mal antut :) Vielleicht uebersehe ich in meiner Betriebsblindheit ja eine Kleinigkeit. Aber ist es trotz aller Konfiguration nicht sehr merkwuerdig das wirklich alle IOs auf High gehen?
Also ich komme mit den Startup-Skripten nie zurecht, ich kann die einfach nicht richtig lesen. Daher nur so ein Schuss ins Blaue. Nach dem Reset sind alle IOs als Input mit aktiviertem Pullup beschaltet. Hast du dich nur wegen der Pullups vermessen? Die Programme, die du geladen hast, setzen die auch die Input/Output-Register? Ich sehe im Startup nichts, was die IOs als Ausgang/Low initialisiert. Das könnte man doch mal testen? Oder einfach die Pullups ausschalten. Hoffentlich erzähle ich keinen Mist, das ist wirklich noch nicht mein Fachgebiet;-)
Das ist definitiv kein Mist. Das die Pullups nach dem Reset aktiv sind war mir nicht bewusst. Ich werde es heute im Laufe des Tages auf jeden fall ausprobieren und die Ergebnisse hier schreiben. Besten Dank!
Leider hat der Tip mit dem Deaktivieren der internen Pull Up Widerstaende nicht geklappt. Hier die derzeitige Main Funktion bzw. Datei.
1 | #include "MainHeader.h" // Board hardware definitions |
2 | |
3 | |
4 | //------------------------------------------------
|
5 | // global arm vars:
|
6 | |
7 | volatile AT91PS_PMC pPMC = AT91C_BASE_PMC; |
8 | volatile AT91PS_USART pUS0 = AT91C_BASE_US0; |
9 | volatile AT91PS_PIO pPIOA = AT91C_BASE_PIOA; |
10 | volatile AT91PS_PIO pPIOB = AT91C_BASE_PIOB; |
11 | volatile AT91PS_AIC pAIC = AT91C_BASE_AIC; |
12 | volatile AT91PS_TCB pTCB = AT91C_BASE_TCB; |
13 | volatile AT91PS_TC pTC0 = AT91C_BASE_TC0; |
14 | volatile AT91PS_TC pTC1 = AT91C_BASE_TC1; |
15 | volatile AT91PS_TC pTC2 = AT91C_BASE_TC2; |
16 | volatile AT91PS_RSTC pRSTC = AT91C_BASE_RSTC; |
17 | volatile AT91PS_MC pMC = AT91C_BASE_MC; |
18 | |
19 | |
20 | |
21 | //--------------------------------------------------------------------------------
|
22 | |
23 | |
24 | int main (void) |
25 | {
|
26 | |
27 | |
28 | LowLevelInit(); |
29 | |
30 | |
31 | pTCB->TCB_BCR = 0; // no SYNC trigger |
32 | pTCB->TCB_BMR = 0x15; // no external clocks |
33 | |
34 | while(1) |
35 | {
|
36 | |
37 | AT91C_BASE_WDTC->WDTC_WDCR=0xA5000001; // reset watchdog |
38 | |
39 | |
40 | |
41 | |
42 | // no pullups:
|
43 | pPIOA->PIO_PPUDR = 0xffff; |
44 | pPIOB->PIO_PPUDR = 0xffff; |
45 | |
46 | // pins are input
|
47 | pPIOA->PIO_ODR=0xffff; |
48 | pPIOB->PIO_ODR=0xffff; |
49 | |
50 | pPIOA->PIO_PER=0xffff; |
51 | pPIOB->PIO_PER=0xffff; |
52 | |
53 | }
|
54 | |
55 | }
|
56 | |
57 | // end main
|
Somit sollten doch zumindest die Pullups auf allen Pins deaktiviert werden und die Pins als EIngaenge definieren...
> Leider hat der Tip mit dem Deaktivieren der internen Pull Up > Widerstaende nicht geklappt. PIO-Clock aktivierten.
Abend :) Steht "leider" schon als letzte Zeilen in der LowLevelInit Funktion welche durch die Main aufgerufen wird
1 | //enable clocks for pioa and piob
|
2 | pPMC->PMC_PCER = (1<<AT91C_ID_PIOA); |
3 | pPMC->PMC_PCER = (1<<AT91C_ID_PIOB); |
Sieht bei mir so aus (PIOA): *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA);
Leider immer noch das gleiche Ergebnis.. Alle Pins sind auf 3,3V.
Wie Achim schon erwähnte den Clock aktivieren. Zusätzlich würde ich mir in der Main einen Ausgang toggeln lassen. Da hängst du dann eine LED dran. Somit siehst du immer, ob dein Prozessor noch läuft. Ich habe auch immer gerne eine serielle Debug-Schnittstelle. Da gebe ich mir die Debug-Meldungen der einzelnen Tasks aus. Ich würde an deiner Stelle versuchen erst einmal ein fertiges kleines Programm zu laden. Funktionieren die Sourcen von Atmel für OpenOCD? Dann hättest du die Sicherheit, dass deine Startup.s nicht die Ursache ist.
Ich kann leider keine LED dran haengen da es ein eigenes Layout und kein Entwicklungsboard ist. Ich messe an Testpads mit dem Oszilloskop die Signalpegel. Die Main Funktion sieht nun so aus. PA25 sollte jetzt sehr schnell toggeln.
1 | pPMC->PMC_PCER = (1<<AT91C_ID_PIOA); //IO CLOCK PA |
2 | pPMC->PMC_PCER = (1<<AT91C_ID_PIOB); //IO CLOCK PB |
3 | |
4 | AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA25; //ENABLE PA25 |
5 | AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA25; // PA25 as 'peripheral manager' controlled pin |
6 | AT91C_BASE_PIOA->PIO_PPUDR = AT91C_PIO_PA25; //Disable PA25 Pull Up resistors |
7 | |
8 | |
9 | while(1) |
10 | {
|
11 | AT91C_BASE_WDTC->WDTC_WDCR=0xA5000001; // reset watchdog |
12 | AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA25; // Set pin state to 'high |
13 | AT91C_BASE_PIOA->PIO_CODR = AT91C_PIO_PA25; // Set pin state to 'low |
14 | |
15 | |
16 | |
17 | |
18 | }
|
Leider tut sich nach wie vor garnichts. ALle Pins haben 3,3V. Ich bin immer noch recht neu auf dem Gebiet AT91SAM7 und ARM Controller ueberhaupt. Welche Sourcen von Atmel für OpenOCD meinst du Stromverdichter?
:
Bearbeitet durch User
http://www.atmel.com/tools/AT91SAMSOFTWAREPACKAGE.aspx Ich meine die Beispiel-Programme aus dem Atmel-Paket. Da ist auch ein einfaches Blinke-Programm dabei. Damit kann man anfangen und hat mal ein Fuß in der Türe.
Vielen Dank fuer den Link. Ich werde es jetet ausprobieren. Worum es mir derzeit aber hauptsaechlich geht ist ein Hardware Problem Auszuschliessen (Siehe Schaltplan am Anfang im Eroeffnungsbeitrag), also ob das Layout oder der Controller selbst vielleicht fehlerhaft sind. Koennte es sein das der Takt nicht funktioniert? Ich habe gerade den XIN Eingang vermessen und das Oszillogramm angehangen. Die Einstellung ist 0,05µS/Div Timebase und 100 mV/Div Amplitude. Sollte so ein Taktsignal aussehen? Am PLLRC Pin ist nichts zu sehen... CH2 (das 0 Signal) zeigt den Nullpunkt an.
Das Oszillogramm sieht gut aus: knapp 19 MHz, 180 mV. Tipp: Keil Entwicklungsumgebung runter laden, damit kann du Mini-Programm (Blinky.c) laden und mit deinem Debugger Schritt für Schritt durch das Programm gehen, und sehen was geht und was nicht geht.
Grossartig, danke! Ich werd es gleich mal runterladen. Noch eine Frage. Ich benutze den Olimex USB Tiny H Debugger, wird der von Keil unterstuetzt?
Dein Debugger wird imho nicht von Keil unterstützt. Was funktionieren sollte ist der Blinky-Code für IAR. Damit sollte auch dein Debugger funktionieren. http://www.iar.com/Service-Center/Downloads/ Viel Glück. Vielleicht kannst ja noch ein ICE für Keil auftreiben. Baremetal mit Arm7 und Arm9 ist halt schon etwas heftig. Da gibt es nicht viel im Netz, und was man so findet ist auch nicht immer alles korrekt. Ein Kollege kämpft gerade mit dem arm9G25 in Baremetal. Der hat vielleicht geflucht;-)
Da hast du allerdings recht, ist wirklich nicht ohne... Das lustige ist, dass der Spartan6 im CSG384 Package (BGA) auf dem Board hervorragend auf anhieb funktioniert und der µC nach fast einer Woche immer noch nicht. Soll heissen ich bin auch seit einer ganzen Weile am Fluchen :D Ist halt sehr schwierig festzustellen ob es ein Firmware oder Hardwareproblem ist... Wobei ich als Entwickler im Hinterkopf irgendwie immer von letzterem ausgehe, zumal eine Firmware, welche exakt auf dem gleichen Controller und mit der selben Toolchain mal lief auf dieser Hardware keinen Muks macht :(
Und es geht immer weiter :) Habe jetzt IAR Workbench als Freeware Lizenz installiert und das Getting Startet Project von hier http://www.atmel.com/tools/AT91SAMSOFTWAREPACKAGE.aspx fuer den AT91SAM7X256 geflasht. Leider mit dem selben Ergebnis, alle Pins sind auf high und nichts passiert... Laut Debugger laeuft das Programm sauber durch, aber die IO Pins machen rein garnichts.
:
Bearbeitet durch User
Hallo Sergej, das ist ja richtig schade, dass dein Board immer-noch nicht laufen will. Verstehe ich das richtig, dass laut Debugger das Ausgangsregister mit dem blinky.c-Code toggelt, du real aber nichts messen kannst? Die Wahrscheinlichkeit eines Hardware-Defektes steigt rasant :-( Ich denke für dich wäre so ein Referenz-Board wie das von Olimex ganz hilfreich. https://www.olimex.com/Products/ARM/Atmel/SAM7-EX256/ Vielleicht kannst du deinen Arbeitgeber überreden, euch ein solches anzuschaffen. Die 60 Euro sind ganz gut investiert. Wenns nix kosten soll, gibts hier das Board für 20Euro, frag mich aber nicht wieso http://www.dontronics-shop.com/sam7-ex-256-development-board-for-or-at91sam7x256-arm7tdmi-s-microcontroller.html Viel Glück, garp
Kenne die IAR Workbench nicht. Kannst du Schritt für Schrit durch das Programm gehen? Kannst du die Registerinhalte der PIOA lesen und beschreiben?
Hi Alle zusammen. Es gibt gute Neuigkeiten. Das Toggeln der LEDs lauft jetzt. Das ganze funktioniert ueber OpenOCD als GDB Server in Kombination mit dem Olimex USB Tiny H Dongle. Habe jetzt die Config Files angepasst und bekomme mit IAR Workbench tatsaechlich Rechtecksignale auf den Schirm :). So ganz trau ich der Sache noch nicht, aber es ist auf jeden Fall ein riesen Fortschritt. Fuer den Fall, dass jemand Anders mal so ein Problem mit den Tools haben sollte, haenge ich hier noch die OpenOCD Target CFG fuer den AT91SAM7 an, die bei mir funktioniert hatte. Ich danke euch allen sehr fuer eure Hilfe, hoffentlich laeuft die Sache jetzt rund!
1 | #use combined on interfaces or targets that can't set TRST/SRST separately |
2 | reset_config srst_only srst_pulls_trst #srst_gates_jtag srst_open_drain none separate |
3 | #jtag init |
4 | if { [info exists CHIPNAME] } { |
5 | set _CHIPNAME $CHIPNAME |
6 | } else { |
7 | set _CHIPNAME sam7x256 |
8 | } |
9 | |
10 | if { [info exists ENDIAN] } { |
11 | set _ENDIAN $ENDIAN |
12 | } else { |
13 | set _ENDIAN little |
14 | } |
15 | |
16 | if { [info exists CPUTAPID] } { |
17 | set _CPUTAPID $CPUTAPID |
18 | } else { |
19 | |
20 | #set _CPUTAPID 0x44008093 |
21 | set _CPUTAPID 0x3f0f0f0f |
22 | } |
23 | |
24 | #adapter_nsrst_delay 100 |
25 | jtag_nsrst_delay 100 |
26 | jtag_ntrst_delay 100 |
27 | jtag_khz 1000 |
28 | |
29 | #jtag init |
30 | |
31 | #jtag newtap Spartan_6 cpu -irlen 6 -ircapture 0x9 -irmask 0x3f -expected-id 0x44008093 |
32 | jtag newtap Spartan_6 cpu -irlen 6 -ircapture 0x1 -irmask 0xf -expected-id 0x44008093 |
33 | jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID |
34 | #jtag newtap AAA cpu -irlen 32 -ircapture 0x1 -irmask 0x3 -expected-id $_CPUTAPID |
35 | |
36 | |
37 | set _TARGETNAME $_CHIPNAME.cpu |
38 | |
39 | target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi |
40 | $_TARGETNAME configure -event reset-init { |
41 | soft_reset_halt |
42 | # RSTC_CR : Reset peripherals |
43 | mww 0xfffffd00 0xa5000004 |
44 | # disable watchdog |
45 | mww 0xfffffd44 0x00008000 |
46 | # enable user reset |
47 | mww 0xfffffd08 0xa5000001 |
48 | # CKGR_MOR : enable the main oscillator |
49 | mww 0xfffffc20 0x00000601 |
50 | sleep 10 |
51 | # CKGR_PLLR: 96.1097 MHz |
52 | mww 0xfffffc2c 0x00481c0e |
53 | sleep 10 |
54 | # PMC_MCKR : MCK = PLL / 2 ~= 48 MHz |
55 | mww 0xfffffc30 0x00000007 |
56 | sleep 10 |
57 | # MC_FMR: flash mode (FWS=1,FMCN=73) |
58 | mww 0xffffff60 0x00490100 |
59 | sleep 100 |
60 | } |
61 | |
62 | $_TARGETNAME configure -work-area-phys 0x00200000 -work-area-size 0x4000 -work-area-backup 0 |
63 | |
64 | #flash bank <driver> <base_addr> <size> <chip_width> <bus_width> <target_number> [<target_name> <banks> <sectors_per_bank> <pages_per_sector> <page_size> <num_nvmbits> <ext_freq_khz>] |
65 | set _FLASHNAME $_CHIPNAME.flash |
66 | flash bank $_FLASHNAME at91sam7 0 0 0 0 0 0 0 0 0 0 0 0 18432 |
67 | |
68 | # For more information about the configuration files, take a look at: |
69 | # openocd.texi |
Glückwunsch :-) Freut mich, dass es endlich geklappt hat. Jetzt muss du nur noch herausfinden, warum es mit der anderen Toolchain nicht laufen will.
Und es wird immer besser :) Nachdem ich das Board einmal mit der IAR Umgebung beschrieben hatte, habe ich jetzt wieder die andere Entwicklungsumgebung getestet ohne was daran zu aendern und siehe da, es funktioniert auf einmal. Sehr mysterioes.... wirklich sehr, aber es funktioniert nun wie es soll :) Frage mich nur was das gewesen sein koennte, fuer das naechste mal.
Manchmal wollen die Kisten einfach, dass sich jemand um sie kümmert. Hat man genug Herzschmerz hineingesteckt, laufen sie wieder ein paar Wochen;-)
Hey Leute ich melde mich mal wieder mit interessanten Neuigkeiten. Ich denke das Problem gefunden zu haben warum das System nicht funktioniert hatte. Der AT91SAM7 hat nvmbits, das zweite entscheidet ueber die boot selection und muss gesetzt werden, wenn SAM-BA nicht benutzt wird. Ich dachte auch dies getan zu haben da es ja in der OpenOCD Config eingetragen ist. Jetzt habe ich die Programmiermeldungen ausgewertet. Als es noch nicht funktioniert hatte stand da: Pagesize: 256 bytes | Lockbits(16): 0 0x0000 | Pages in lock region: 0 Securitybit: 0 | Nvmbits(3): 0 0x0 Anscheinend hat das setzten des Bits also nicht geklappt. IAR Workbench hat es wohl richtig gemacht. Jetzt wo es funktioniert, sieht die Meldung wie folgt aus: Pagesize: 256 bytes | Lockbits(16): 0 0x0000 | Pages in lock region: 0 Securitybit: 0 | Nvmbits(3): 0 0x4 Die 0x4 ist entscheidend, jetzt ist das Bit offensichtlich gesetzt worden. Ich danke euch Allen nochmals fuer die grossartige Hilfe. Vielleicht hilft dieser Thread mal jemandem weiter.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.