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)
Code:
/****** 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);
2. Lösungsansatz
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
Lesezeichen