Hallo Leute,
entschuldigt die späte Rückmeldung...
Also den MCP4728 kann ich nun ansteuern. Ich habe mir dazu eine Lib
geschrieben, die ich dann auch gerne hier bereitstellen möchte, wenn
Bedarf ist.
Jedoch bleibt noch eine Sache offen: Die Ansteuerung via General Calls
und dem LDAC Pin, insbesondere in erster Linie das Lesen (und Schreiben)
der I2C Adresse des MCP4728.
Das Protokoll dazu ist in der PDF auf Seite 33 (5.4.4) dargestellt.
http://ww1.microchip.com/downloads/en/DeviceDoc/22187E.pdf
In meinem Fall ist der LDAC Pin direkt mit dem Atmega32 PA0 Pin
verbunden.
Für die I2C Kommunikation verwende ich die Lib von Peter Fleury.
Folgenden Code habe ich bisher erfolglos getestet:
Aus der MAIN:
1 | ...
|
2 |
|
3 | DDRA |= (1 << PA0);
|
4 | PORTA |= (1 << PA0);
|
5 | i2c_init();
|
6 |
|
7 | uint8_t addr = mcp4728_readAddr(PA0);
|
8 |
|
9 | ...
|
die Funktion mcp4728_read_addr:
1 | uint8_t mcp4728_readAddr(uint8_t ldac_pin)
|
2 | {
|
3 | PORTA |= (1 << ldac_pin);
|
4 | i2c_start(MCP4728_GENERAL_CALL);
|
5 | if(i2c_write_ldac(MCP4728_READADDRESS, ldac_pin) == 1) {
|
6 | i2c_stop();
|
7 | return 1;
|
8 | }
|
9 |
|
10 | if(i2c_start(MCP4728_RESTART) == 1) {
|
11 | i2c_stop();
|
12 | return 1;
|
13 | }
|
14 |
|
15 | //i2c_start_wait(MCP4728_RESTART);
|
16 |
|
17 | uint8_t addrByte = i2c_readAck();
|
18 | i2c_stop();
|
19 |
|
20 | return addrByte;
|
21 | }
|
Die Funktion i2c_write_ldac (um das Timeing des LDAC Pins zu erreichen:
1 | unsigned char i2c_write_ldac( unsigned char data , uint8_t ldac)
|
2 | {
|
3 | uint8_t twst;
|
4 |
|
5 | // send data to the previously addressed device
|
6 | TWDR = data;
|
7 | TWCR = (1<<TWINT) | (1<<TWEN);
|
8 |
|
9 | _delay_us(86);
|
10 | PORTA &= ~(1 << ldac);
|
11 |
|
12 | // wait until transmission completed
|
13 | while(!(TWCR & (1<<TWINT)));
|
14 |
|
15 | // check value of TWI Status Register. Mask prescaler bits
|
16 | twst = TW_STATUS & 0xF8;
|
17 | if( twst != TW_MT_DATA_ACK) return 1;
|
18 | return 0;
|
19 |
|
20 | }/* i2c_write */
|
Um das Timeing für den LDAC Pin zu erreichen habe ich versucht nach dem
Absenden der Daten mir mit einem Delay zu helfen, jedoch ohne Erfolg. Im
Grunde ist das die gleiche i2c_write Funktion wie von Peter Fleury, nur
eben mit dem delay.
Hat jemand einen Rat? Danke euch!