Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 I2C
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
dimone
При окончании записи в eеprom бит STOP СR1 остается не сброшенным , и при следующем сеансе записи подпрограмма затыкется, подскажите пожалуйста надо ли принудительно сбрасывать этот бит , в примерах такого не видел sad.gif
PoReX
Reference manual
Цитата
STOP : Stop generation
The bit is set and cleared by software, cleared by hardware when a Stop condition is
detected, set by hardware when a timeout error is detected.

In Master Mode:
0: No Stop generation.
1: Stop generation after the current byte transfer or after the current Start condition is sent.

In Slave mode:
0: No Stop generation.
1: Release the SCL and SDA lines after the current byte transfer.

Note: When the STOP, START or PEC bit is set, the software must not perform any write
access to I2C_CR1 before this bit is cleared by hardware. Otherwise there is a risk of
setting a second STOP, START or PEC request.

Может ошибка записи вылазит? Код в студию.
dimone
-первый вызов-отлично,
во второй не встают MSL \ BUSY


byt_wrt(0, my_var);
byt_wrt(0, my_var);


-функция записи однго байта по адресу:
Код
void byt_wrt(short adr,  char data)    {

i2c1_adr=i2c_epr_adr|((adr>>7)&0x06);    
*(i2c1_tp+1)=adr;    
*i2c1_tp=data;      
    
i2c1_tc=2;
i2c1_sts=i2c_bus;          
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)){};       
I2C_GenerateSTART(I2C1, ENABLE);
}


-обработчик:
Код
     switch (I2C_GetLastEvent(I2C1))
     {
     /* Start condition released */
     case I2C_EVENT_MASTER_MODE_SELECT:        
        I2C_Send7bitAddress(I2C1, i2c1_adr, I2C_Direction_Transmitter); //sending ADDR with TX attr.
     break;
          
     /* slave confirmed ADDR */    
     case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:                      
        I2C_SendData(I2C1, *(i2c1_tp+--i2c1_tc));//sending the first byte
     break;              
    
     /* byte has gone */               
     case I2C_EVENT_MASTER_BYTE_TRANSMITTED:
                
       if(i2c1_tc>0){
        I2C_SendData(I2C1, *(i2c1_tp+--i2c1_tc));}//sendin' the following byte, if such exists        
        else {
            I2C_GenerateSTOP(I2C1, ENABLE); i2c1_sts=i2c_don; } //no more transmissions needed - sending STOP
     break;}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.