Hallo zusammen, ich möchte einen TDA7348 per SPI ansprechen. Nun habe ich Hartware seitig aufgebaut und versuch mich nun an einem ersten Test. Ich muss dazu sagen, dass ich bisher nur EEproms per SPI angesprochen haben. Nach dem Datenblatt gibt es eine Adress, eine Subadresse und einen Datenblock. (s.Bild) Ich finde nun aber keinen Wert für R/W. Wenn ich Daten an den TDA senden möchte, ist das dann Write? Unklar ist mir auch noch ob ich ACK sende oder bekomm ich das als Bestätigung? Was mach ich mit den "x" Bits bei Subadresse? Oder sende ich nur 4bit? Zum Test habe ich einfach die EEprom Code Teile genommen und geändert. Kann das so funkrionieren?
1 | int tda7348_write_byte(uint8_t saddr, uint8_t buf) { |
2 | uint8_t n = 0; |
3 | |
4 | restart:
|
5 | if (n++ >= MAX_TRIES) |
6 | return -1; |
7 | begin:
|
8 | |
9 | // start
|
10 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); |
11 | while (!(TWCR & (1 << TWINT))); |
12 | if (TW_STATUS == TW_MT_ARB_LOST) goto begin; |
13 | if ( (TW_STATUS != TW_REP_START) && (TW_STATUS != TW_START)) { |
14 | return -1; |
15 | }
|
16 | |
17 | // send 0x440
|
18 | // 0x440 = 1000100 0
|
19 | // 7 bits: <chip address>
|
20 | // last bit: <R/W> 0W? 1R?
|
21 | TWDR = 0x440; |
22 | TWCR = (1 << TWINT) | (1 << TWEN); |
23 | while (!(TWCR & (1 << TWINT))); |
24 | if (TW_STATUS == TW_MT_SLA_NACK) goto restart; |
25 | if (TW_STATUS == TW_MT_ARB_LOST) goto begin; |
26 | if (TW_STATUS != TW_MT_SLA_ACK) goto error; |
27 | |
28 | // send 4 bits subaddress
|
29 | TWDR = saddr >> 4; |
30 | TWCR = (1 << TWINT) | (1 << TWEN); |
31 | while (!(TWCR & (1 << TWINT))); |
32 | if (TW_STATUS != TW_MT_DATA_ACK) goto error; |
33 | |
34 | // send 8 bits Data
|
35 | TWDR = buf; |
36 | TWCR = (1 << TWINT) | (1 << TWEN); |
37 | while (!(TWCR & (1 << TWINT))); |
38 | if (TW_STATUS != TW_MT_DATA_ACK) goto error; |
39 | |
40 | quit:
|
41 | // send stop condition
|
42 | TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); |
43 | return 1; |
44 | |
45 | error:
|
46 | // send stop condition
|
47 | TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); |
48 | return -1; |
49 | }
|
Vielen Danke Steffen
