Hallo zusammen,
ich komme hier leider allein nicht weiter.
Mein PIC Sendet und empfängt daten via I2C2 von einem Temperatur sensor.
Funktioniert alles tippitoppi
Nun möchte ich via I2C1 einen 12 bit DAC Ansteuern der in abhängigkeit
der Temperatur seine Spannung ändert.
Soweit so gut.
Nun das "problem" wenn ich wie bei I2C2 auch die MCC generierten
Funktionen nutze (die dort ja wunderbar funktionieren) sendet er mir
genau 2 byte aber nichts aus den daten.
Daraufhin habe ich eine eigene funktion gebaut die so aussieht:
1 | void writeADC( uint8_t adress, uint8_t adress2,
|
2 | uint8_t byte1, uint8_t byte2) {
|
3 | if(!I2C1CON0bits.EN)
|
4 | {
|
5 | //CNTIF 0; ACKTIF 0; WRIF 0; ADRIF 0; PCIF 0; RSCIF 0; SCIF 0;
|
6 | I2C1PIR = 0x00;
|
7 | //CNTIE disabled; ACKTIE disabled; WRIE disabled; ADRIE disabled; PCIE disabled; RSCIE disabled; SCIE disabled;
|
8 | I2C1PIE = 0x00;
|
9 | //BTOIF No bus timout; BCLIF No bus collision detected; NACKIF No NACK/Error detected; BTOIE disabled; BCLIE disabled; NACKIE disabled;
|
10 | I2C1ERR = 0x00;
|
11 | //Count register
|
12 | I2C1CNT = 0xFF;
|
13 | //Enable I2C1
|
14 | I2C1CON0bits.EN = 1;
|
15 | }
|
16 |
|
17 | I2C1TXB = adress;
|
18 | __delay_us(100);
|
19 |
|
20 | I2C1TXB = adress2;
|
21 | __delay_us(100);
|
22 | I2C1TXB = byte1;
|
23 | __delay_us(100);
|
24 | I2C1TXB = byte2;
|
25 | __delay_us(86);
|
26 |
|
27 | //Disable I2C1
|
28 | I2C1CON0bits.EN = 0;
|
29 | //CNTIF 0; ACKTIF 0; WRIF 0; ADRIF 0; PCIF 0; RSCIF 0; SCIF 0;
|
30 | I2C1PIR = 0x00;
|
31 | //Set Clear Buffer Flag
|
32 | I2C1STAT1bits.CLRBF = 1;
|
33 | }
|
nun kommen (gemessen mit dem Oszi) alle signale an, aber es tut sich
nichts... hat jemand eie idee?
Vielen Dank euch.
der Konverter ist ein MCP4725
PS:
Habe ich möglicherweise die Daten falsch übergeben das die MCC funktion
sie nicht gesendet hat??
1 | //dataDAC ist ein uint16_t
|
2 | //ADC und DAC habe ich bei der bennenung mal verwechselt, stimmt jedoch
|
3 | I2C1_Write2ByteRegister(I2C1_ADC_ADRESS, I2C1_ADC_BIT1, dataDAC);
|
4 |
|
5 | void I2C1_Write2ByteRegister(i2c1_address_t address, uint8_t reg, uint16_t data)
|
6 | {
|
7 | while(!I2C1_Open(address)); // sit here until we get the bus..
|
8 | I2C1_SetDataCompleteCallback(wr2RegCompleteHandler,&data);
|
9 | I2C1_SetBuffer(®,1);
|
10 | I2C1_SetAddressNackCallback(NULL,NULL); //NACK polling?
|
11 | I2C1_MasterWrite();
|
12 | while(I2C1_BUSY == I2C1_Close()); // sit here until finished.
|
13 | }
|