Jump to content
vis-vetal

F103C8 Передаёт 2 Байта По I2C

Recommended Posts

Всем привет. Столкнулся с проблемой, может кто уже сталкивался с подобным, или может хоть подскажите в какую сторону смотреть. Дело вот в чём: простая тестовая программа, передранная целиком и полностью из интернета(упростил в процессе поиска глюка, потом по функциям всё разложу) передаёт число 0х44 в устройство с адресом 0х12 по I2C.

Настроил тактирование контроллера, порты и сам интерфейс. Бросаю стартовый бит, нормально. Бросаю адрес, отлично. Отсылаю байт данных, а на выходе идёт 18 бит, то бишь 2 байта. В чём моя ошибка? Контроллер stm32f103C8T6. Среда - coocox.

Да там ещё была загвоздка, вместо проверки на окончание передачи адреса и самого байта пришлось ставить задержки. Я знаю что это колхоз, но не смог найти какой флаг проверять. Если кто подскажет буду очень рад.

Привожу код и скрин с анализатора.


#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
#include "stm32f10x_rcc.h"

//********************************************************************************
unsigned char InitClk()
{
unsigned long int TimeOut = 10000;
//Запустить HSE
RCC->CR |= RCC_CR_HSEON; //Включить генератор HSE
while((RCC->CR & RCC_CR_HSERDY)==0) //Ожидание готовности HSE
if(TimeOut) TimeOut--;
if(TimeOut==0) return 1; //Ошибка!!! Генератор HSE не запустился
RCC->CR |= RCC_CR_CSSON; //Разрешить работу системы защиты сбоя HSE
//Подключить систему к HSE
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_HSE; //Выбрать источником тактового сигнала HSE
//Настроить делитель для AHB
RCC->CFGR &= ~RCC_CFGR_HPRE; //Очистка битов предделителя "AHB Prescaler"
RCC->CFGR |= RCC_CFGR_HPRE_DIV2; //Установить "AHB Prescaler" равным 2
return 0; //Все ok, работаем от HSE
}
//********************************************************************************
//Function: обработчик прерывания при сбое генератора HSE //
//********************************************************************************
void NMI_Handler(void)
{
//Сбросить флаг системы контроля сбоя HSE
if (RCC->CIR & RCC_CIR_CSSF) RCC->CIR |= RCC_CIR_CSSC;
//Если контроллер здесь, значит HSE не работает
//Что-то можно предпринять: перезапустить генератор, дать сигнал аврии и т.п.
}
//********************************************************************************
GPIO_InitTypeDef gpio;
I2C_InitTypeDef i2c;
/*******************************************************************/
void init_I2C1(void)
{//Конфигурация I2C и портов под него
GPIO_PinRemapConfig(GPIO_Remap_I2C1, DISABLE);
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
I2C_DeInit (I2C1);
GPIO_DeInit(GPIOB);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
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 = 50000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
int main(void)
{
InitClk();
init_I2C1();
uint8_t transmissionDirection = I2C_Direction_Transmitter;
uint8_t slaveAddress = 0x12;
// Генерируем старт - тут все понятно )
I2C_GenerateSTART(I2C1, ENABLE);
// Ждем пока взлетит нужный флаг
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, slaveAddress, transmissionDirection);
uint8_t i;
for(i=0;i<0x50;i++);//Задержка на время адреса
uint8_t data = 0x44;
I2C_SendData(I2C1, data);
for(i=0;i<0x70;i++);//Задержка на время данных
I2C_GenerateSTOP(I2C1, ENABLE);
while(1){ }
}

post-48585-0-94993200-1405013710_thumb.jpg

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения


  • Цифровой мультиметр-амперметр, 200В 10А

  • Similar Content

    • By Black Jack
      Здравствуйте, программатор st-link не видит микроконтроллер STM32F103VET6. Присоединение кварца и внешнее тактирование не помогли. Что не так делаю, подскажите.


      схема.dch плата.dip
    • By strifonoff
      это снова я...
      Максимального быстродействия АЦП можно достичь при частоте АЦП 14 МГц, а этого можно добиться только при системной частоте 56 МГц (если внешний кварц на 8 МГц).
      Но возникает проблема со скоростями UART: значение регистра BRR не получится выставить так, что бы скорость была из стандартного ряда.
      Назрели несколько вопросов:
      1) возможно ли менять системную частоту на лету? (чую, что можно, но пока не знаю как) 
      2) критична ли ошибка в скорости UART по сравнению со стандартной? (что будет на другой стороне заранее не известно, т.к. любой может воткнуть свой девайс работающий на какой-то заранее согласованной стандартной скорости)
      3) как поведёт себя железо (состояние ОЗУ, регистров перефирии, состояние ног и т.д.) на изменение частоты? Две части программы () практически независимы, их объединяет только один массив, который наполняется в первой половине, а обрабатывается в другой.
       
    • By xrou
      Здравствуйте, пытаюсь обрабатывать пакеты приходящие от ESP8266 (01), но проблема в том, что пакеты всегда разной длины ведь мы не знаем, что напишет пользователь (хотя даже ответы на AT команды всегда разной длины). Знаю, что в плате F0 есть прерывание по символу, но у меня F103C8T6. Как быть? Создать массив большого размера нельзя, т.к. HAL_Recieve_IT ждет пока не наберется нужное кол-во символов.
      Приму любую идею и советы
    • By Deel
      Всем доброго времени суток!!! Нужна помощь ЗНАТАКОВ !!! Строим самодельный руль для ПК!!! Руль с прямым приводом (DirectDrive) на базе STM32. Двигатель управляется через BTS7960, всё как бы работает, но при большой нагрузке одна плата не справляется, выгорают чипы!!! И из-за этого хочется запараллелить две платы. Но и тут порой беда, две запараллеленные платы порой глючат, и двигатель не слушается! Вот и решил заново нарисовать свою схему, прошу проверить на правильность. Выкладываю оригинальную схему на плату от китайцев, и свою предполагаемую схему. Если есть ошибка, прошу сильно не пинайте, лучше подскажите



      Забыл упомянуть про движок - dynamo sliven pik 12 3/10-3


    • By For the North !
      Подскажите, как подключить электретный микрофон к отладочной плате stm32f0discovery. Выбрал микрофон VS4011S36, 4,5 В, 4 мм. Нужно знать конкретно какие провода к каким входам подключать. Заранее спасибо!


      https://static.chipdip.ru/lib/735/DOC000735976.pdf   --- Datasheet на плату
×
×
  • Create New...