M. N. schrieb:
> Das ist ja auch richtig, damit die Übertragung überhaupt gestartet wird.
> Nachdem das letzte Byte übertragen wurde, mußt Du den Interrupt
> abschalten.
>
> Das könnte so aussehen:
> spi_enableInterrupt(false);
Ok, dass wusste ich so nicht. Dann muss ich das Interrupt einfach
ausschalten.
Bei der jetztigen Codeversion habe ich das Interrupt noch nicht
ausgeschaltet, aber es funktioniert in dem Sinne von es schreibt die
ganze Zeit.
1 | void main(void) {
|
2 |
|
3 | spi_init();
|
4 | spi_setMode(Master, FallingEdge, LeadingEdge, MSBfirst);
|
5 | spi_selectChip(true);
|
6 | spi_enableInterrupt(true);
|
7 |
|
8 | for(;;)
|
9 | {
|
10 | __RESET_WATCHDOG();
|
11 |
|
12 | if( spi_checkComplete()==true) {
|
13 |
|
14 | SendeTakt(27);
|
15 | }
|
16 | }
|
17 | }
|
18 |
|
19 | __interrupt VectorNumber_Vspi1 void ISR_SPI() {
|
20 |
|
21 | __RESET_WATCHDOG();
|
22 |
|
23 | if(sbufferpos<32) {
|
24 | sbufferpos = sbufferpos + 1;
|
25 |
|
26 | if((SPI1S&(SPI1S_SPRF_MASK)) == 0) {
|
27 | }
|
28 | else{
|
29 | SPI1S;
|
30 | SPI1D;
|
31 | }
|
32 | if((SPI1S&(SPI1S_SPTEF_MASK)) == 0){
|
33 | }
|
34 | else{
|
35 | SPI1S;
|
36 | SendeTakt(27);
|
37 | }
|
38 | }
|
39 | else{
|
40 | sbufferpos = 0;
|
41 | }
|
42 | }
|
Hier die spi_checkComplete:
1 | bool spi_checkComplete()
|
2 | {
|
3 | uint8 Temp;
|
4 |
|
5 | if((SPI1S&(SPI1S_SPTEF_MASK)) == 0)
|
6 | {
|
7 | return false;
|
8 | }
|
9 | else
|
10 | {
|
11 | // SPI Data Buffer lesen um Interrupt Bit zu leeren
|
12 | Temp = SPI1D;
|
13 | return true;
|
14 | }
|
15 | }
|
Den Watchdog sollte man ja eigentlich nciht im Interrupt feeden. Wenn
ich es allerdings nicht mache, wird das Watchdoginterrupt nach etwa 20
Durchläufen des Sendevorgangs ausgelöst. Ziemlich komisch, es werden
keine Fehler angezeigt -> COP Watchdog caused a Reset
Hat hier noch jemand eine Idee?
Controller: MC9S08AW60 (freescale)
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08AW60.pdf
Auf jeden Fall schon mal vielen Dank für die hilfreichen Antworten!