Перейти к содержанию

Не могу разобраться со скоростью I2C на PIC16F1847 регистр SSP1ADD


Zombie47

Рекомендуемые сообщения

Не понимаю в чем дело. Регистр SSP1ADD может иметь значение от 0 до 255
2021-12-28_00-11-52.jpg.54193b50eb692e74b2408d21bb0ea62b.jpg

Fosc у меня 8mhz то-есть 8000000hz
То-есть если он равен 255 то SCLx pin clock period будет равен 7812hz а если он будет равен 1 то частота будет 1Mhz
И у меня это работает но на половину.
Вот присваиваю регистру SSP1ADD=255;  и шлю по i2c и что вижу анализатором:

2021-12-28_00-20-45.jpg.0e2a17f975f8e11502c8aade0c1ec96b.jpg

А то что частота в районе 7000hz и шим 56%, ну да ладно. 
Вбиваю  SSP1ADD=19; в надежде получить скорость 100khz:
2021-12-28_00-27-02.jpg.f93faaaad3dc9a3c5067c10985eacb45.jpg

Шим теперь почему то уплыл до 76%
Но самое интересное что импульс нижнего уровня по длине 5.66us и еслиб положительный импульс был тоже в районе 5.66us то это и была бы частота в районе 100khz.
Что я делаю не так? По идее ШИМ должен быть в районе 50%
Функции писал не сам. Функция которая как я понимаю формирует SCL вот эта:
 

//wait for transfer to finish
void I2CWait(void)
{
   while ((SSP1CON2 & 0x1F ) || ( SSP1STAT & 0x04 ) );
   /* wait for any pending transfer */
}

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

18 часов назад, Zombie47 сказал:

Не понимаю в чем дело.

Может потому, что :

Цитата

Функции писал не сам.

?

PS: Смешались в кучу - кони, люди.... SPI, ШИМ, проценты, импульсы, микросекунды, скорость (в ГЦ почему-то), ... Как эта вся куча написанного Вами связана между собой ?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

А что скорость никак не связана с герцами и милисекундами? и у I2C шины шим произвольный? 
Вот все функции по I2C
 


//Initialize I2C in master mode, Sets the required baudrate
void I2CInit(void)
{
long FOSC=8000000;
long I2C_SPEED_HZ=5000;
   //SSP1ADD  = ((8000000/4000)/100) - 1;  //((_XTAL_FREQ/4000)/I2C_SPEED) - 1  // page 286 I2C_SPEED 100 ýòî 85khz, 1000 ýòî 380khz
   //SSP1ADD  = ((FOSC/4)/I2C_SPEED_HZ) - 1;  //((_XTAL_FREQ/4)/I2C_SPEED) - 1
   SSP1ADD  = 2;
   SSP1STAT = 0b10000000;   /* Slew rate disabled */
   SSP1CON1 = 0b00101000;   /* SSPEN = 1, I2C Master mode, clock = FOSC/(4 * (SSPADD + 1)) */
//       SSPEN_bit=0;
}

//Send a start condition on I2C Bus
void I2CStart(void)
{
   SEN_bit = 1;       /* Start condition enabled */
   while(SEN_bit);    /* automatically cleared by hardware */
                               /* wait for start condition to finish */
}

//Send a stop condition on I2C Bus
void I2CStop(void)
{
   PEN_bit = 1;           /* Stop condition enabled */
   while(PEN_bit);        /* Wait for stop condition to finish */
                                   /* PEN automatically cleared by hardware */
}

//Sends a repeated start condition on I2C Bus
void I2CRestart(void)
{
   RSEN_bit = 1;        /* Repeated start enabled */
   while(RSEN_bit);     /* wait for condition to finish */
}

//Generates acknowledge for a transfer
void I2CNck(void)
{
   ACKDT_bit = 0;     // 0 means ACK
   ACKEN_bit = 1;     // Send ACKDT value
   while(ACKEN_bit);    /* wait for ack data to send on bus */
}

//Generates Not-acknowledge for a transfer
void I2CAck(void)
{
   ACKDT_bit = 1;     // 0 means ACK
   ACKEN_bit = 1;     // Send ACKDT value
   while(ACKEN_bit);    /* wait for ack data to send on bus */
}

//wait for transfer to finish
void I2CWait(void)
{
   while ((SSP1CON2 & 0x1F ) || ( SSP1STAT & 0x04 ) );//SSP1STAT & 0x04  ýòîò áèò transmit in progress
   /* wait for any pending transfer */
}

//Send 8-bit data on I2C bus - 8-bit data to be sent on bus data can be either address/data byte
void I2CSend(unsigned char dat)
{
   SSP1BUF = dat;    /* Move data to SSPBUF */
   while(BF_bit);       /* wait till complete data is sent from buffer */
   I2CWait();       /* wait for any pending transfer */
}

//Read 8-bit data from I2C bus
unsigned char I2CRead(void)
{
  unsigned char temp;
/* Reception works if transfer is initiated in read mode */
   RCEN_bit = 1;        /* Enable data reception */
   while(!BF_bit);      /* wait for buffer full */
   temp = SSP1BUF;   /* Read serial buffer and store in temp register */
   I2CWait();       /* wait to check any pending transfer */
   return temp;     /* Return the read data from bus */
}

 

Изменено пользователем Zombie47
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, Zombie47 сказал:

и у I2C шины шим произвольный? 

Что за ШИМ у I2C ? :unsure:

 

1 час назад, Zombie47 сказал:

А что скорость никак не связана с герцами и милисекундами?

Может быть чем-нибудь и связана, но не измеряется в них.
Hz - это частота. Ms - это время.

Ссылка на комментарий
Поделиться на другие сайты

Еслиб я был умный и грамотный я бы не задавал тут вопросов) Я просто попытался предоставить максимум информации, так как правильно заданный вопрос это 50% успеха.

Ссылка на комментарий
Поделиться на другие сайты

Цитата

А на линиях I2C подтягивающие резисторы какой величины используете? Похоже, какой-то клок-стретчинг происходит.

я тоже подумал об этом и на всякий случай глянул осциллограму, думал вдруг анализатор просто не видет нарастания фронта и тд. Но нет там тоже самое.
резисторы в Oled стоят какие то. Вроде по 10к

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Мне вот потребовалось перенести вывод на OLED дисплей с PIC18  на PIC16, и оказалось у XC8 библиотек управления I2C для 16 микроконтроллеров нет, вот наткнулся на эту ветку и взял кусок отсюда, вроде работает, а вроде нет. В общем ошибка в расчёте задачи коэффициента деления. Проще взять из документации.

 

2022-07-05 18-16-17 DOC012452621.pdf — Mozilla Firefox.png

Ссылка на комментарий
Поделиться на другие сайты

Оказался ещё модуль записи в I2C не подходящий к этому контроллеру, полностью не разобрался, но вот начал работать.

signed char WriteI2C(unsigned char dat)
{
   SSP1BUF = dat;    /* Move data to SSPBUF */
     if ( SSP1CON1bits.WCOL )      // test if write collision occurred
   return ( -1 );              // if WCOL bit is set return negative #
   while(SSP1STATbits.BF);       /* wait till complete data is sent from buffer */
   I2CWait();       /* wait for any pending transfer */
//   if ( SSP1CON2bits.ACKSTAT ) // test for ACK condition received
//    	 return ( -2 );			// return NACK
//	else 

//   if ( !PIR1bits.SSP1IF ) // test for ACK condition received
//   	 return ( -2 );
//   else 
	return ( 0 );              //return ACK
}

 

Ссылка на комментарий
Поделиться на другие сайты

Заметил проблему с дисплеем на SSD1106 как отрабатывает Wait, через некоторое время дисплей гаснет, та же библиотека дисплея работающая на PIC18 работает без проблем. Приходится делать пустые обращения к дисплею что бы он не выключался.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...