Hi,
bei einem AT91SAM9263 Controller hab ich das Problem, dass beim Zugriff
auf einen SPI-IC (insgesamt hängen zwei ICs an SPI1-Bus), immer der
andere auch mit angesprochen wird.
Der SPI-Datentransfer läuft mittels DMA ab und beim enablen des
Tranceivers der DMA leuchten obwohl der TLC5922 nicht angesprochen wird,
immer die LEDs kurzzeitig auf! Die Werte, die per SPI zurückgeliefert
werden (vom zweiten IC, dem Touch-Controller) sind richtig, aber das
aufleuchten der LEDS ist merkwürdig.
Zu Beginn programmiere ich das Mode-Register vom SPI neu, damit der
richtige Chipselect ausgewählt wird (steht auch im Register dann richtig
drinnen) und anschließend wird der DMA transport vorbereitet
1 | AT91PS_PDC pPdc = (AT91PS_PDC) &(AT91C_BASE_SPI1->SPI_RPR);
|
2 |
|
3 | pPdc->PDC_PTCR = AT91C_PDC_RXTDIS;
|
4 | pPdc->PDC_RPR = (unsigned int) bufferRX;
|
5 | pPdc->PDC_RCR = 3;
|
6 |
|
7 | pPdc->PDC_PTCR = AT91C_PDC_TXTDIS;
|
8 | pPdc->PDC_TPR = (unsigned int) bufferTX;
|
9 | pPdc->PDC_TCR = 3;
|
10 |
|
11 | pPdc->PDC_PTCR = AT91C_PDC_RXTEN;
|
12 |
|
13 | pPdc->PDC_PTCR = AT91C_PDC_TXTEN;
|
14 | /* bei diesem Cmd leuchten die LEDs vom TLC kurzzeitig auf */
|
15 |
|
16 |
|
17 | do {
|
18 | dStatus = AT91C_BASE_SPI1->SPI_SR;
|
19 | uTimeout++;
|
20 | }
|
21 | while ((( dStatus & AT91C_SPI_RXBUFF) != AT91C_SPI_RXBUFF) && (uTimeout < AT91C_TOUCHSCREEN_TIMEOUT));
|
22 |
|
23 | //disable receive / transmit transfer
|
24 | pPdc->PDC_PTCR = AT91C_PDC_RXTDIS;
|
25 | pPdc->PDC_PTCR = AT91C_PDC_TXTDIS;
|
26 |
|
27 | (void)AT91C_BASE_SPI1->SPI_RDR;
|
Hat jmd eine Idee an was das liegen könnte?
Gruß
Hannes