Easyelectronics.ru

Электроника для всех
Текущее время: 30 июн 2022, 13:17

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: STM8L + I2C
СообщениеДобавлено: 04 мар 2019, 01:35 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 2043
Привет!

Решил добить встроенный I2С (c первого раза пару месяцев назад он у меня не взлетел, пришлось писать софтовый)
Теперь появилось время и решил попробовать разобраться в чем же дело.

Итак имеется: рабочий код под STM32F0 и STM8S.
небольшие непонятки с кодом для STM8L:

Инициализация I2C:

Код:
//------------LCD-I2C-CONFIG----

CLK->PCKENR |= CLK_PCKENR_I2C;
GPIOC->DDR |=0b111;//Pc0,1,2 Output
GPIOC->CR1 &=(~0b11) | 1<<2;//Open Drain SCL, SDA /Push pull - Reset Pin
GPIOC->CR2 |=0b111;//Fast speed
//-------I2C ENABLE----------------
I2C->FREQR = 2;                       //2MHz
I2C->CCRH=0x0A;
I2C->CCRL=0x0B;
I2C->CR1 |= I2C_CR1_PE;
RES_HI();


Посылка старт последовательности и адреса Slave:
Код:
void I2C_Start(void)             {//Start
while(I2C->SR3 & I2C_SR3_BUSY){}; //I2C_BUSY
I2C->CR2 |= I2C_CR2_START;
while(!(I2C->SR1 & I2C_SR1_SB)){}; // Start - Generated
I2C->DR = Addr; // Send Slave Addr
while(!(I2C->SR1 & I2C_SR1_ADDR)){}; // ACK - Received
}

Запись байта:
Код:
void I2C_write(unsigned char byte_send)                           {//WRITE
  while(!(I2C->SR1 & I2C_SR1_TXE)){};
  I2C->DR = byte_send;
   }


Процедура инициализации:
Код:
void LCD_Init(void)                                                       {// INIT LCD T191
   
     RES_LO();delay_ms(10);
     RES_HI();delay_ms(10);

     I2C_Start();
     I2C_write(0x00);I2C_write(0x31);
     I2C_write(0x14);I2C_write(0x06);                                                          // Initial Settings
     I2C_write(0x30);I2C_write(0x11);
     I2C_write(0x05);I2C_write(0x31);
     I2C_write(0x9A);                                                                                  // Contrast
     I2C_write(0x0C);                                                                                  //0x0C -Normal mode, 00 - Mirror mode
     I2C_write(0x30);I2C_write(0x0C);                                                          // ?????????? ?????
     I2C_write(0x40);I2C_write(0x80);                                                          // GoTo x=0, y=0
     I2C_Stop();
    }


Зависает после отсылки адреса слейва на отправке второго байта, не понимаю почему.
Вложение:
freez.jpg
freez.jpg [ 96.04 Кб | Просмотров: 3286 ]


Догадываюсь, что упустил какую то мелочь - но вот что именно понять не могу, подскажите в чем может быть дело.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + I2C
СообщениеДобавлено: 04 мар 2019, 02:10 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 2043
Откопал в чем дело, надо было считать SR3
Изменил посылку Старта добавив чтение бита MSL и все заработало.
Код:
void I2C_Start(void)                                                    {//Start
    while(I2C->SR3 & I2C_SR3_BUSY){}; //I2C_BUSY
    I2C->CR2 |= I2C_CR2_START;
    while(!(I2C->SR1 & I2C_SR1_SB)){}; // Start - Generated
    I2C->DR = T191_Addr;
    while(!(I2C->SR1 & I2C_SR1_ADDR)){}; // ACK - Received
    while(!(I2C->SR3 & I2C_SR3_MSL)){}; // Master mode


Нашел вот тут:
Вложение:
freez1.jpg
freez1.jpg [ 103.62 Кб | Просмотров: 3280 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + I2C
СообщениеДобавлено: 11 мар 2019, 23:06 
Только пришел

Зарегистрирован: 23 янв 2015, 19:44
Сообщения: 6
Прошу помощи! Тоже пытаюсь рулить аппаратным I2C. Вроде работает отправка на прерываниях нормально при передачи одного пакета (от START до STOP), НО при передачи дальше чудеса.
Попробую объяснить. Передача 3 байт-отправка работает. Передача 3 байт-> задержка-> Передача 3 байт- передается только вторая посылка. При чем START от первой вроде срабатывает, потом происходит задержка а потом отправка второй посылки.
Инициализация:
Код:
I2C_CR1_PE = 0;                   

  I2C_FREQR = 16;                     
  I2C_CCRL=0x50;                     
  I2C_CCRH_CCR=0x00;
  I2C_CCRH_F_S = 0;                 

  I2C_OARH_ADDMODE = 0;             
  I2C_OARH_ADDCONF = 1;             
  I2C_TRISER = 17;
 
  I2C_ITR=0x07;
  I2C_CR1_PE = 1;
  I2C_CR2_ACK = 1;

Отправку запускаю так:
Код:
I2C_CR2_ACK=1;
  I2C_CR2_POS=0;
  I2C_CR2_START=1;

Задержка это стандартный _delay_ms, среда IAR, камень stm8s003.


Вложения:
i2c_001.png
i2c_001.png [ 3.49 Кб | Просмотров: 3180 ]
i2c_002.png
i2c_002.png [ 4.12 Кб | Просмотров: 3180 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + I2C
СообщениеДобавлено: 12 мар 2019, 00:13 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 2043
К сожалению сейчас свои старые наработки не смогу посмотреть для STM8S (поменял HDD на ноуте).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + I2C
СообщениеДобавлено: 12 мар 2019, 00:55 
Старожил
Аватара пользователя

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 5584
Откуда: КЧР, поселок Нижний Архыз
https://github.com/eddyem/STM8_samples/ ... 7005/i2c.c


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + I2C
СообщениеДобавлено: 12 мар 2019, 01:04 
Только пришел

Зарегистрирован: 23 янв 2015, 19:44
Сообщения: 6
Eddy_Em писал(а):
https://github.com/eddyem/STM8_samples/blob/master/si7005/i2c.c

Спасибо, попробую как там.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + I2C
СообщениеДобавлено: 27 фев 2021, 19:49 
Здравствуйте!

Зарегистрирован: 30 янв 2021, 15:01
Сообщения: 2
Помогите кто-нибудь, вроде настроил i2c, но при старте линии в ноль не падают

Код:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

/* Private defines -----------------------------------------------------------*/
//---------------------Системные константы------------------------------------
#define TIM4_PERIOD 124 //период таймера
#define USER_TIME_CYCLE 10 //время пересчета контроллера в МС
int Fcpu = 0;

//---------------------Системные переменные-----------------------------------
//Переменные циклов пересчета
unsigned int system_plc_time = USER_TIME_CYCLE;

/* Private function prototypes -----------------------------------------------*/
static void CLK_Config(void); //функция настройки тактирования
static void TIM4_Config(void); //функция настройки таймера
static void SystemInit(void); //функция инициализации МК

/* Private functions ---------------------------------------------------------*/
//Функция настройки тактирования
static void CLK_Config(void)
{
  CLK_DeInit(); //переинициализируем тактовый генератор
  CLK_HSICmd(ENABLE); //включаем внутренний скоростной тактировщик
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //устанавливаем предделитель 1 (16мГц)
  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //устанавливаем предделитель 1 (16мГц)
  Fcpu = CLK_GetClockFreq() / 1000000;
  CLK_CCOConfig(CLK_OUTPUT_MASTER); //выведим тактовую частоту на пин С4

}

//Функция настройки таймера
static void TIM4_Config(void)
{
  //настраиваем таймер на 1мс
  TIM4_DeInit(); //переинициализируем таймер
  TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD); //зададим предделители
  TIM4_ClearFlag(TIM4_FLAG_UPDATE); //сбросим флаги
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); //сделаем еще манипуляцию
  TIM4_Cmd(ENABLE);//включим таймер
}

//Функция настройки таймера
static void I2C_Config(void)
{
  I2C_DeInit();
  I2C_Init(100000, 0x10, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, Fcpu);
  I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
  I2C_Cmd(ENABLE);
}

//Функция инициализации переферии МК
static void SystemInit(void)
{
  CLK_Config(); //Настройка частоты МК
  TIM4_Config(); //Настройка таймера МК
  I2C_Config(); //Настройка I2C МК
  GPIO_DeInit(GPIOB);
  GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_OD_HIZ_FAST); //SCL
  GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_OD_HIZ_FAST); //SDA
  GPIO_ExternalPullUpConfig(GPIOB, (GPIO_PIN_4 | GPIO_PIN_5) ,ENABLE);
  //Включаем прерывания 
  enableInterrupts();
}


//-----------------Прерывание каждую 1 мс-------------------------------------
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
  disableInterrupts();
  //считаем милисекунды для пересчета программы пользователя
  system_plc_time--;
 
  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  enableInterrupts();
}

INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
  disableInterrupts();
 
  enableInterrupts();
}

/* Начало программы ----------------------------------------------------------*/

void main(void)
{
  SystemInit();
  /* Infinite loop */
  while (1)
  {
    I2C_GenerateSTART(ENABLE);
    //while (I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(33, I2C_DIRECTION_TX);
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    I2C_SendData(0x01);
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    I2C_GenerateSTOP(ENABLE);
  }
 
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
    nop();
  }
}
#endif


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/



Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB