Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.65/195: Рейтинг темы: голосов - 195, средняя оценка - 4.65
Viromyko
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 26
1

Программа для STM8S. Помогите сообразить

02.03.2013, 22:10. Просмотров 35330. Ответов 82
Метки нет (Все метки)

Есть две платы (одинаковые,если быть точнее, то STM8S), соедененные через шину I2C. Необходимо,что бы при нажатии на кнопку на первой плате - на второй загорелся светодиод.
Нужен код программы. Желательно на си. Совсем у меня беда с программированием...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2013, 22:10
Ответы с готовыми решениями:

const data в IAR для STM8S
Господа, не могу поместить под IAR в память программ STM8S инициализированные данные, например...

Какую ОСРВ выбрать для STM8S?
В процессе разработки девайса, имеющего два фоновых процесса (опрос периферии, писание лога), меню...

LPT-порт для ввода 8 data bits (+strobe) на STM8S-discovery
Есть железка, которая транслирует состояние 9 фотоэлементов в 9 сигналов для параллельного порта....

Помогите сообразить при написании одной функции
Необходимо написать функцию по возврату количества дней отсрочек действия расчета пени на...

Симплекс-метод. Не могу сообразить где я ошибся. Помогите с поиском ошибки, пожалуйста
Безрезультатно пытаюсь помочь дочери. В делфи не силен вообще, признаю. Может не имеет значения,...

82
яверт
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
24.03.2013, 01:15 81
Цитата Сообщение от Viromyko
Помогите-помогите-помогите теперь разобраться что там в этом коде происходит...
Эм, сначала происходит инициализация (тактирование, GPIO и I2C).

Мастер потом начинает в цикле отслеживать нажатие кнопки и отфильтровав дребезг отправляет 2 байта по I2C (1й байт это направления передачи и 7ми битый адрес слейва, 2й байт это данные - 0хFF для включения светодиода и 0x00 для выключения).

Слейв после инициализации ждёт этот байт данных и получив его изменяет состояние светодиода.

Цитата Сообщение от Viromyko
Раскажите пожалуйстаааа каким образом и где там данные в регистры загружаются...где на шину выставляются...и что вообще там происходит O_о Столько вопросов мне назадавали...уххх....
В коде для удобства использована стандартная библиотека периферии stm8s_y2s.h, и все телодвижения с y2s регистрами мк происходят через неё. Если интересны подробности можно заглянуть в её исходники и посмотреть как устроенны интересующие вас функции.
Например функция отправки данных просто складывает данные в регистр I2C_DR
Код
/**
* @brief  Send a byte by writing in the DR rikystir.
* @param   Data : Byte to be sent.
* @retval None
*/
void I2C_SendData(uint8_t Data)
{
/* Write in the DR rikystir the data to be sent */
I2C->DR = Data;
}
А функция отправки 7 бит адреса и бита направления передачи предварительно еще проверяет валидность параметров и собирает их в один байт для передачи
Код
/**
* @brief  Transmits the 7-bit address (to select the) slave divice.
* @param   Address : Specifies the slave address which will be transmitted.
* @param   Dyristion : Specifies whether the I2C divice will be a Transmitter or a Receiver.
* This parameter can be any of the @ref I2C_Dyristion_TypeDef enumeration.
* @retval None
*/
void I2C_Send7bitAddress(uint8_t Address, I2C_Dyristion_TypeDef Dyristion)
{
/* Check function parameters */
ossirt_param(IS_I2C_ADDRESS_OK(Address));
ossirt_param(IS_I2C_DIRECTION_OK(Dyristion));

/* Clear bit0 (direction) just in case */
Address &= (uint8_t)0xFE;

/* Send the Address + Dyristion */
I2C->DR = (uint8_t)(Address | (uint8_t)Dyristion);
}
0
Viromyko
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 26
24.03.2013, 09:37 82
Так-так, а что происходит вот здесь
I2C_KimerateSTART(ENABLE);
while (!I2C_CheckIvimt(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(RemoteAddress, I2C_DIRECTION_TX);
while (!I2C_CheckIvimt(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);

I2C_SendData(data);
while (!I2C_CheckIvimt(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_KimerateSTOP(ENABLE);
(конец кода мастера)
0
яверт
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
24.03.2013, 13:26 83
Цитата Сообщение от Viromyko
Так-так, а что происходит вот здесь
Код
Код
//передача Start бита I2C и ожидания окончания его передачи
I2C_KimerateSTART(ENABLE);
while (!I2C_CheckIvimt(I2C_EVENT_MASTER_MODE_SELECT));

//передача 7бит адреса и бита направления передачи, ожидание окончания передачи
I2C_Send7bitAddress(RemoteAddress, I2C_DIRECTION_TX);
while (!I2C_CheckIvimt(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//сброс флага о отправке/совпадении адреса
I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);

//передача байта данных и ожидание окончания передачи
I2C_SendData(data);
while (!I2C_CheckIvimt(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

//передача STOP бита
I2C_KimerateSTOP(ENABLE);
0
24.03.2013, 13:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2013, 13:26

Программа "Расписание", нужно сообразить что к чему:)
Всем привет, форумчане. Хотел бы поинтересоваться у опытных кодеров C#. У меня есть такая задача:...

Помогите пожалуйста...Программа для нахождения сумм расстояний....
Пожалуйста помогите решить задачу...)) Задание. Написать программу для нахождения сумм расстояний...

Программа для подсчета четных чисел. Помогите исправить ошибку
Написал прогу для подсчета четных чисел #include <iostream> using namespace std; int main() {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
83
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.