Easyelectronics.ru

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

Часовой пояс: 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 Кб | Просмотров: 3285 ]


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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 Кб | Просмотров: 3279 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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 Кб | Просмотров: 3179 ]
i2c_002.png
i2c_002.png [ 4.12 Кб | Просмотров: 3179 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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 часов


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

Сейчас этот форум просматривают: Andycat


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

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

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