Hallo zusammen, Ich möchte mit dem PSoC 4200L 24-Bit Daten per SPI (SCB Block) senden. Mein Problem ist, dass der PSoC nur 16 Bits am Stück senden will. Ich muss aber, wegen der SS Leitung, alle 24 am Stück senden. Muss doch irgendwie gehen. Hat hier Jemand Erfahrung mit dem uC? Danke
>Ich muss aber, wegen der SS Leitung, alle 24 am Stück senden. >Muss doch irgendwie gehen. Dann sende doch einfach 3x8Bit. SS low 1. Byte senden 2. Byte senden 3. Byte senden SS high
Daran habe ich natürlich als erstes gedacht. Das klingt jetzt etwas doof, aber ich kann dieses "SS low" und "ss high" in den ganzen verschachtelten Funktionen nicht finden. Ich kann mal ein Codeschnipsel posten:
1 | /*******************************************************************************
|
2 | * Function Name: SPI_SpiUartWriteTxData
|
3 | ********************************************************************************
|
4 | *
|
5 | * Summary:
|
6 | * Places a data entry into the transmit buffer to be sent at the next available
|
7 | * bus time.
|
8 | * This function is blocking and waits until there is space available to put the
|
9 | * requested data in the transmit buffer.
|
10 | *
|
11 | * Parameters:
|
12 | * txDataByte: the data to be transmitted.
|
13 | *
|
14 | * Return:
|
15 | * None
|
16 | *
|
17 | *******************************************************************************/
|
18 | void SPI_SpiUartWriteTxData(uint32 txData) |
19 | {
|
20 | #if (SPI_INTERNAL_TX_SW_BUFFER_CONST)
|
21 | uint32 locHead; |
22 | #endif /* (SPI_INTERNAL_TX_SW_BUFFER_CONST) */ |
23 | |
24 | #if (SPI_CHECK_TX_SW_BUFFER)
|
25 | {
|
26 | /* Put data directly into the TX FIFO */
|
27 | if ((SPI_txBufferHead == SPI_txBufferTail) && |
28 | (SPI_SPI_UART_FIFO_SIZE != SPI_GET_TX_FIFO_ENTRIES)) |
29 | {
|
30 | /* TX software buffer is empty: put data directly in TX FIFO */
|
31 | SPI_TX_FIFO_WR_REG = txData; |
32 | }
|
33 | /* Put data into TX software buffer */
|
34 | else
|
35 | {
|
36 | /* Head index to put data */
|
37 | locHead = (SPI_txBufferHead + 1u); |
38 | |
39 | /* Adjust TX software buffer index */
|
40 | if (SPI_TX_BUFFER_SIZE == locHead) |
41 | {
|
42 | locHead = 0u; |
43 | }
|
44 | |
45 | /* Wait for space in TX software buffer */
|
46 | while (locHead == SPI_txBufferTail) |
47 | {
|
48 | }
|
49 | |
50 | /* TX software buffer has at least one room */
|
51 | |
52 | /* Clear old status of INTR_TX_NOT_FULL. It sets at the end of transfer when TX FIFO is empty. */
|
53 | SPI_ClearTxInterruptSource(SPI_INTR_TX_NOT_FULL); |
54 | |
55 | SPI_PutWordInTxBuffer(locHead, txData); |
56 | |
57 | SPI_txBufferHead = locHead; |
58 | |
59 | /* Check if TX Not Full is disabled in interrupt */
|
60 | if (0u == (SPI_INTR_TX_MASK_REG & SPI_INTR_TX_NOT_FULL)) |
61 | {
|
62 | /* Enable TX Not Full interrupt source to transmit from software buffer */
|
63 | SPI_INTR_TX_MASK_REG |= (uint32) SPI_INTR_TX_NOT_FULL; |
64 | }
|
65 | }
|
66 | }
|
67 | #else
|
68 | {
|
69 | /* Wait until TX FIFO has space to put data element */
|
70 | while (SPI_SPI_UART_FIFO_SIZE == SPI_GET_TX_FIFO_ENTRIES) |
71 | {
|
72 | }
|
73 | |
74 | SPI_TX_FIFO_WR_REG = txData; |
75 | }
|
76 | #endif
|
77 | }
|
hinter dem "SPI_TX_FIFO_WR_REG" verbirgt sich die physikalishe Registeradresse. Ich sehe hier keinen Hinweis auf SS low :(
Wenn ich SS Leitung im SPI Block deaktiviere und das vor dem Senden per Hand auf Masse ziehe, dann fehlt mir logischerweise der SPI Clock. SS und SPI Clock gehören aber zusammen. Hm, was machen?
Also ich kenn das nur vom PSOC4200, sollte aber ähnlich sein. Wenn du Daten in den Tx Speicher schreibts wird ss auf low gezogen, wenn der Transfer beendet ist wieder auf high. D.h wenn du schnell genug deine Daten in den Tx Speicher legst sollte das funktionieren. Meistens sind 4 oder 8 Byte Hardware Speicher vorhanden, sollte bei 3 Byte also problemlos gehen. Evt die PutArray Funktion benutzen (im Datenblatt beschrieben).
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.