Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="Chip115",url="/forum/viewtopic.php?p=3364936#p3364936"]В интернете полно примеров, но там используются всякие костыли типа

Код: Выделить всё

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); 
что, откровенно, вызывает кровь из глаз.[/uquote]
вполне нормальная конструкция :dont_know:

[uquote="Chip115",url="/forum/viewtopic.php?p=3364936#p3364936"]Смысл такой, что если циклически вызывать

Код: Выделить всё

ui8EepromSendByte 
и чекать что вернула функция, то можно рулить тем, что бы данные отправлялись тогда, когда предыдущие гарантированно уйдут. Такая конструкция приемлема или есть более интересная реализация?[/uquote]
каноничный подход - сначала дождаться взведения флага TXE, потом чего-то пытаться отправить

Код: Выделить всё

void ui8EepromSendByte(uint8_t byte)
{
  while (!(SPI2->SR & SPI_SR_TXE)); // ждем
  SPI2->DR = byte;
}
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3364944#p3364944"]Вопрос то не по Сям.
Надо было здесь топик создавать, сразу бы про DMA разговор бы пошел :).[/uquote]
Точно. Виноват. Подумал что алгоритмические вопросы тоже сюда )) Наверное передислацируюсь туда. Если есть возможноть, то удалите, пожалуйста, мой пост, что бы не захламлять.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Chip115 писал(а):SPI2->SR &= ~SPI_SR_TXE;
Так не сработает. Бит только для чтения.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Понял, спасибо.
Еще вопрос.
Что значит эта запись?

Код: Выделить всё

#define SPI_SendData8(SPIx, data)   *(__IO uint8_t *)&SPIx->DR = data
Интересует правая запись
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Это значит запись байта data по адресу SPIx->DR
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

А что за магия с указателями? Почему нельзя написать SPIx->DR = data и зачем нужна операция И?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Chip115 писал(а): зачем нужна операция И
Почитайте про указатели.
Chip115 писал(а):Почему нельзя написать SPIx->DR = data
Кто сказал что нельзя?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Ну так если можно, то зачем пляска с указателями?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

ну программист немного заработался. DR там уже должен быть __IO, просто лишний каст.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Chip115",url="/forum/viewtopic.php?p=3365299#p3365299"]Ну так если можно, то зачем пляска с указателями?[/uquote]
В старой реализации SPI, как у F1, достаточно было выбрать 8-ми битный формат в CR1 и тогда при записи байта в DR байт и оправлялся, а в новом SPI все иначе, там чтобы ушел байт нужно привести 16-ти битный DR к указателю на байт, иначе отправятся сразу два байта.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Спасибо! Это и хотел узнать.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 94
Зарегистрирован: Пт фев 14, 2014 20:45:33
Откуда: Северный Кавказ

Сообщение Amigosam »

Пытаюсь изучить работу таймера и прерываний. MK AT89C2051, кварц 4 МГц. Компилятор языка Си ICC8051. По задумке таймер должен перезагружаться каждые 0,05 с (предустановка таймера 0xBEE5 - 48869). Для визуализации на портах P3.7 и P1.3 подвешены светодиоды. По поему (вероятно ошибочному мнению) HG2 на P3.7 должен одну сек. гореть, одну сек. быть потушенным. А HG1 на P1.3 мигать с частотой около 20 Гц. Но что-то пошло не так... Не могу разобраться сам в чём косяк.

Практическая работа программы: https://yadi.sk/i/gbIkzjEZ3Uw8Bv
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Народ, подскажите, задан 8-битный массив, к примеру:

Код: Выделить всё

uint8_t Test_Buffer1 [] = { 0x00,0x01,0x02,0x03,0x04,0x05};
Как его прочитать 16-битной переменной? Это для MAX7219 - инициализация и данные - в 8-битнов виде (так удобнее), а SPI у него 16-бит?
Хорошему коту и в декабре - март :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

uint16_t x=*((uint16_t *)&array[n]);

Как то так наверное.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3366884#p3366884"]uint16_t x=*((uint16_t *)&array[n]);
Как то так наверное.[/uquote]
Благодарю, буду пробовать.
Хорошему коту и в декабре - март :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Можно еще вот так.
uint16_t *array16;
array16=(uint16_t *)&array8[0];
uint16_t x = array16[n];
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3366869#p3366869"]Это для MAX7219 - инициализация и данные - в 8-битнов виде (так удобнее)[/uquote]
Удобнее будет единая функция на все случаи, компонующая 16-битную посылку из своих параметров - адреса и данных в требуемой спецификацией порядке. А инициализационные таблицы переоформите в виде:

Код: Выделить всё

struct {
  uint8_t addr;
  uint8_t data;
} aInitTable[] = {
  { 0x01, 0xFF },
  { 0x02, 0xAF },
  { 0x03, 0xCD }
};
Можно, конечно, и кувалдочкой *((uint16_t*)Test_Buffer1 + n) - но это, в зависимости от платформы, грозит преждевременным знакомством с понятием endianness используемой аппаратной части.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3366900#p3366900"]Удобнее будет единая функция на все случаи, компонующая 16-битную посылку из своих параметров - адреса и данных в требуемой спецификацией порядке. А инициализационные таблицы переоформите в виде:

Код: Выделить всё

struct {
  uint8_t addr;
  uint8_t data;
} aInitTable[] = {
  { 0x01, 0xFF },
  { 0x02, 0xAF },
  { 0x03, 0xCD }
};
Можно, конечно, и кувалдочкой *((uint16_t*)Test_Buffer1 + n) - но это, в зависимости от платформы, грозит преждевременным знакомством с понятием endianness используемой аппаратной части.[/uquote]
Благодарю
Хорошему коту и в декабре - март :)
Встал на лапы
Аватара пользователя
Сообщения: 94
Зарегистрирован: Пт фев 14, 2014 20:45:33
Откуда: Северный Кавказ

Сообщение Amigosam »

[uquote="Amigosam",url="/forum/viewtopic.php?p=3365619#p3365619"]Пытаюсь изучить работу таймера и прерываний. MK AT89C2051, кварц 4 МГц. Компилятор языка Си ICC8051. По задумке таймер должен перезагружаться каждые 0,05 с (предустановка таймера 0xBEE5 - 48869). .... Но что-то пошло не так... Не могу разобраться сам в чём косяк.[/uquote]
Спасибо всем просмотревшим моё сообщение :) Разобрался сам...
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Amigosam",url="/forum/viewtopic.php?p=3367573#p3367573"]Спасибо всем просмотревшим моё сообщение :) Разобрался сам...[/uquote]
Разберись заодно и с тем, что если изучаешь работу таймеров с прерываниями, но программа на Си не работает, то это еще не означает, что есть какие-то вопросы по C/C++ :)
Ответить

Вернуться в «Разные вопросы по МК»