Hallo liebe Forumsgemeinde,
ich bin ein Anfänger, was die Programmierung angeht. Ich möchte einen Temperatursensor(DS1621) via I2C mit einem LPC 1769 ansteuern. Als Entwicklungsumgebung kommt Coocox mit dem GCC Compiler zum Einsatz.
Ich habe auch schon ein paar mögliche Lösungswege gefunden, allerdings komme ich noch nicht an einen Logikanalyser bzw einem Oszi ran, um zu überprüfen, ob überhaupt Signale ankommen.
Vielleicht kann der eine oder andere mal drüber schauen und mir sagen, ob ich auf dem richtigen Weg bin?
Includes mit anschließender Initialisierung der I2C-Peripherie:
Code:#define Start_Convert_Temp 0xEE /*Deklaration des Registers Start_Convert_Temp*/ #define Read_Temp 0xAA //Deklaration des Registers Read_Temp #define DS1621_Write 0x90 //Schreibender Zugriff #define DS1621_Read 0x91 //lesender Zugriff #define I2CDevice_M LPC_I2C0 //Auswahl der Peripherie -> I2C0 #define I2CDEV_S_ADDR (0x90>1) //Grundadresse ohne R/W-Bit 0x48 I2C_Init(I2CDevice_M,100000); //Einstellen der Taktrate -> 100kHz I2C_Cmd(I2CDevice_M,ENABLE); // Einschalten der I2C-Peripherie
1. Lösungsansatz
Hier habe ich die Funktionen, die Dank der Bibliotheken bereitgestellt werden benutzt. (Im Anhang)
2. LösungsansatzCode:/****** Temperatur Messen****/ int TempH, TempL; I2C_Start(I2CDevice_M); //Starten im Master Mode I2C_SendByte(I2CDevice_M,DS1621_Write); //Slave ansprechen 0x90 I2C_SendByte(I2CDevice_M,Start_Convert_Temp); //Beginn der Temperaturmessung 0xEE I2C_STOP(I2CDevice_M); //Eigentliche Messung beenden (?) I2C_Sart(I2CDevice_M); //Nochmaliger Start I2C_SendByte(I2CDevice_M,DS1621_Write); //Slave Ansprechen 0x90 I2C_SendByte(I2CDevice_M,Read_Temp); //gemessene Temperatur lesen 0xAA I2C_STOP(I2CDevice_M); _delay_ms(200); //200ms dem Sensor Zeit zum Messen der Temperatur geben /******** Temperatur anzeigen lassen *****/ I2C_Start(I2CDevice_M); //Starten im Master Mode I2C_SendByte(I2CDevice_M,DS1621_Write); // 0x90 I2C_STOP(I2CDevice_M); I2C_Start(I2CDevice_M); I2C_SendByte(I2CDevice_M,DS1621_Read); TempH=I2C_GetByte(I2CDevice_M,*retdat,!FALSE ack); /*schauen, was ich MIT den *retdat machen muss..*/ TempL=I2C_GetByte(I2CDevice_M,*retdat,0 ack); I2C_STOP(I2CDevice_M); ret=(TempH*1+TempL/256);
Hierbei benutze ich nicht die mitgelieferten Funktionen, sondern schreibe meine eigenen..Man beachte, die Syntax
Code:1. Versuch---------------------------------------------------------------------- //Transmit void I2C_write(void) { I2C_M_SETUP_Type transferMCfg; transferMCfg.sl_addr7bit = I2CDEV_S_ADDR; //0x48, muss Grundadresse sein, da hier nur 7 bit zulässig sind transferMCfg.tx_data = DS1621_Write; //0x90 transferMCfg.tx_length = 1; //ist es nicht besser, einen buffer anzugeben? transferMCfg.rx_data = 0 transferMCfg.rx_length = NULL; transferMCfg.retransmissions_max = 3; I2C_MasterTransferData(I2CDevice_M, &transferMCfg, I2C_TRANSFER_POLLING); } void I2C_send(void) { I2C_M_SETUP_Type receiveMCfg; // statt transfer -> receive ?? transferMCfg.sl_addr7bit = I2CDEV_S_ADDR; //0x48 transferMCfg.tx_data = DS1621_Read; //0x91 transferMCfg.tx_length = 1; transferMCfg.rx_data = Read_Temp //Temperatur abholen 0xEE transferMCfg.rx_length = NULL; transferMCfg.retransmissions_max = 2; I2C_MasterTransferData(I2CDevice_M, &transferMCfg, I2C_TRANSFER_POLLING); }
Der Code soll später noch um eine LCD Anzeige erweitert werden.
Aber erstmal wollte ich das Programmgerüst zum Laufen bringen.. Ist das so ok? Kann ich vielleicht die I2C Bibliothek von Fleury nehmen, aber die Bibliothek von CooCox für den LCD?
Ich weiß echt nicht mehr weiter..
Glg Tom







Zitieren


Lesezeichen