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

Не могу разобраться со скоростью 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 */
}

 

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

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

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

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

Цитата

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

?

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

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

А что скорость никак не связана с герцами и милисекундами? и у 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
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

 

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Цитата

А на линиях 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 пользователей онлайн

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