 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
MvE Član


Pridružen-a: Ned 04 Jan 2009 12:24 Prispevkov: 146 Aktiv.: 0.73 Kraj: MB
|
Objavljeno: Ned Nov 23, 2014 2:17 am Naslov sporočila: Težava z STM32F1 |
|
|
Lep pozdrav,
že dobra dva večera se trudim usposobiti I2C komunikacijo na STM32F103RB (NUCLEO). Težava je ta, da po koncu branja enega byta (ko bi že moral biti STOP pulz), SCL linija pošlje ponovnih nekaj pulzov medtem, ko se SDA postavi na '1'. Naj povem, da je pri branju enega byta sprejet podatek pravilen.
Enako se zgodi pri branju dveh bytov vendar ne morem preveriti točnosti podatka (če to res pošilja slave ali je naključna varianta). Edina opazna razlika je ta, da v tem primeru na koncu pride do STOP signala.
Na spodnjih dveh slikah se vidi, da tudi po NACK linija SCL deluje naprej.
Hvala!
Prilagam tudi kodo (za branje enega byta):
Inicializacija I2C...
Koda: |
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2, ENABLE);
|
Funkcija za branje...
Koda: |
int i2c_readByte(I2C_TypeDef* I2Cx, char addressI2CRB, char regI2CRB, uint8_t *dataOutI2CRB)
{
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2Cx, ENABLE);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2Cx, addressI2CRB<<1, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2Cx, regI2CRB);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2Cx, ENABLE);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2Cx, addressI2CRB<<1, I2C_Direction_Receiver);
I2C_AcknowledgeConfig(I2Cx, DISABLE);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED));
*dataOutI2CRB = I2C_ReceiveData(I2Cx);
I2C_GenerateSTOP(I2Cx, ENABLE);
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
I2C_AcknowledgeConfig(I2Cx, ENABLE);
return 1;
}
|
Opis: |
byti:1.(address+write),2.(register),3.(address+read),4.(received byte),5.(??) |
|
Velikost datoteke: |
18.42 KB |
Pogledana: |
11 krat |

|
Opis: |
byti:1.(address+write),2.(register),3.(address+read),4.(received byte 1),5.(received byte 2),6.(??) |
|
Velikost datoteke: |
21.7 KB |
Pogledana: |
3 krat |

|
|
|
Nazaj na vrh |
|
 |
tilz0R Član


Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 5.70 Kraj: Črnomelj
|
Objavljeno: Ned Nov 23, 2014 12:02 pm Naslov sporočila: |
|
|
Zdravo,
mogoče bo delovalo, mogoče ne.
Pri sebi imam za branje enega byta izklopljeno ACK funkcijo.
Zamenjaj kodo z "read" funkcijo, pred "return" stavkom.
Koda: |
I2C_AcknowledgeConfig(I2Cx, ENABLE); |
z
Koda: |
I2C_AcknowledgeConfig(I2Cx, DISABLE); |
Lahko ti pošljem mojo I2C knjižnico, sicer za F4, ampak so STD funkcije praktično iste.
Spremenit je potrebno samo konfiguracijo pinov.
Več na ZS
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
 |
Sigi Član

Pridružen-a: Čet 31 Jul 2014 11:42 Prispevkov: 207 Aktiv.: 1.58 Kraj: Kamnik
|
Objavljeno: Ned Nov 23, 2014 12:56 pm Naslov sporočila: |
|
|
Ali si preveril errata sheet, namreč za I2C je precej napisanega. Za vsak primer preveri...
lp
|
|
Nazaj na vrh |
|
 |
MvE Član


Pridružen-a: Ned 04 Jan 2009 12:24 Prispevkov: 146 Aktiv.: 0.73 Kraj: MB
|
Objavljeno: Pon Nov 24, 2014 5:54 pm Naslov sporočila: |
|
|
Danes sem imel spet nekaj prostega časa, da sem lahko preizkusil.
tilz0R, kodo za I2C sem našel na tvoji strani in jo vstavil za test.... deluje! Kaj je bila napaka, ne vem. Grem zdaj skozi program. Aja, pred tem sem po tvojem predlogu zamenjal tudi STOP signal (disable z enable) pa ni imelo učinka.
Prav tako sem imel v rokah errata, ampak sem moral zgrešit vrstni red ali nekaj podobnega, Resnično nisem našel napake.
Hvala vama za pomoč! Se ponovno javim ob naslednji težavi
LP
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 458 dni
Powered by phpBB © 2001, 2005 phpBB Group
|