Hallo zusammen,
ich komme nicht weiter, und weiß nicht mehr wo ich ansetzen soll.
Stand: es existiert in voll funktionsfähiges STM32 Projekt (SW/HW).
Dieses Projekt wurde von Hardware seite minimal verändert: ein ext.
Interrupt weniger, andere Bauform des EEPROMs, etwas andere ADC
beschaltung.
Nunja, es funktioniert mittlerweile alles bis auf das Lesen und
Schreiben des EEPROMs.
An der Configuration/Ini wurde im Vergleich zu dem alten Projekt nichts
verändert, lediglich wie gesagt die Bauform (gleiche Pinbelegung) was ja
völligst egal ist.
1 | void I2c_Configuration(void)
|
2 | {
|
3 | // Deinitialize I2C1 interface
|
4 | I2C_DeInit(I2C1);
|
5 |
|
6 | // I2C1 configuration
|
7 | I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
8 | I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
9 | I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS;
|
10 | I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
11 | I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
12 | I2C_InitStructure.I2C_ClockSpeed = I2C1_SPEED;
|
13 | I2C_Init(I2C1, &I2C_InitStructure);
|
14 |
|
15 | // I2C1 Peripheral Enable
|
16 | I2C_Cmd(I2C1, ENABLE);
|
17 | }
|
Zum debuggen habe ich das mal in die main eingebaut
1 | uint8_t nBuffer[2];
|
2 | nBuffer[0]=6;
|
3 | nBuffer[1]=6;
|
4 |
|
5 | if(Epr_WriteBuffer(nBuffer, 100, 2) == ERROR)
|
6 | EH_SetErrorCode(ERR_EEPROM);
|
In der Epr_WriteBuffer Routine bleib ich beim debuggen in :
Epr_WaitStandbyState(); hängen
1 | ErrorStatus Epr_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
|
2 | {
|
3 | uint16_t nAddr, nPage, nCount, nNumOfBytes;
|
4 | ErrorStatus status = ERROR;
|
5 |
|
6 | nAddr = WriteAddr;
|
7 | nPage = 0;
|
8 | nCount = 0;
|
9 | nNumOfBytes = 0;
|
10 |
|
11 | while (NumByteToWrite > 0)
|
12 | {
|
13 | // get page where to write to
|
14 | nPage = nAddr / I2C_PAGE_SIZE;
|
15 |
|
16 | // get number of bytes which can be written to this page
|
17 | nNumOfBytes = ((nPage + 1) * I2C_PAGE_SIZE) - nAddr;
|
18 |
|
19 | // if there are more bytes to write than remaining space in this page -> fill up this page completely
|
20 | if(NumByteToWrite > nNumOfBytes)
|
21 | nCount = nNumOfBytes;
|
22 | else
|
23 | nCount = NumByteToWrite;
|
24 |
|
25 | // write data to EEPROM
|
26 | status = Epr_WritePage(pBuffer, nAddr, nCount);
|
27 | Epr_WaitStandbyState();
|
28 |
|
29 | // update variables
|
30 | NumByteToWrite -= nCount;
|
31 | nAddr += nCount;
|
32 | pBuffer += nCount;
|
33 | }
|
34 |
|
35 | return status;
|
36 | }
|
In dieser Routine bleib er in der Zeile: while(!(I2C_ReadRegister(I2C1,
I2C_Register_SR1) & 0x0002) hängen
1 | void Epr_WaitStandbyState(void)
|
2 | {
|
3 | __IO uint16_t SR1_Tmp = 0;
|
4 |
|
5 | do
|
6 | {
|
7 | /* Send START condition */
|
8 | I2C_GenerateSTART(I2C1, ENABLE);
|
9 | /* Read I2C1 SR1 register */
|
10 | SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);
|
11 | /* Send EEPROM address for write */
|
12 | I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
|
13 | }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));
|
14 |
|
15 | /* Clear AF flag */
|
16 | I2C_ClearFlag(I2C1, I2C_FLAG_AF);
|
17 |
|
18 | /* STOP condition */
|
19 | I2C_GenerateSTOP(I2C1, ENABLE);
|
20 | }
|
Aber warum er das tut kann ich nicht sagen.
Die Funtion I2C_ReadRegister läuft durch und folgende Werte von "tmp"
werden nacheinander angenommen.
0
1073763328
1073763348
Ich verstehe nicht warum er in der oberen while!(...) Schleife hängen
bleibt, bzw. grundsätzlich nicht warum es hier Probleme gibt mit dem
EEPROM obwohl alles gleich bis auf die Bauform ist...
Wäre super wenn mir jemand einen GEdankenanstoß geben kann.
PS: Ich arbeite mit Eclipse und debugge über GDB-Server. Allerdings
steigt mir bei diesem Projekt immer der GDB server aus wenn er einen
breakpoint erreicht. So konnte ich mich an die Stelle wo er hängt vor
tasten.
Gruß Michl