Технический форум по робототехнике.
40inD » 29 дек 2005, 12:50
Кто силен в программизме? Мне нужно из одного контроллера в другой передать значения около десятка переменных по i2c. Как это лучше организовать? Структурой?
avr123.nm.ru » 29 дек 2005, 13:01
дак по-байтно и передать. можно конечно сделать i2c слэйв, а можно просто по линии SDA передать с помощью програмного UART.
40inD » 29 дек 2005, 13:06
у меня и будет мастер и слейв, я хочу сообразить, в программе как это организовать. Слейв будет передавать. Как мастер будет запрашивать значение какой-л. переменной?
Например, мастер хочет узнать у слейва, какое значение у него имеет переменная А. Как это сделать? Я с i2c только с часами и памятью работал.
А так как переменных передавать много, чтобы не терять времени на запрос каждой переменной, нужно передать сразу пакет. И как это сделать я вообще не догоняю.
wolf » 29 дек 2005, 13:29
40inD писал(а):у меня и будет мастер и слейв, я хочу сообразить, в программе как это организовать. Слейв будет передавать. Как мастер будет запрашивать значение какой-л. переменной?
Например, мастер хочет узнать у слейва, какое значение у него имеет переменная А. Как это сделать? Я с i2c только с часами и памятью работал.
А так как переменных передавать много, чтобы не терять времени на запрос каждой переменной, нужно передать сразу пакет. И как это сделать я вообще не догоняю.
Переменная характеризуется адресом и размером в байтах. Передать переменную - значит, передать N байт, располагающихся по её адресу. На приёмной стороне эти байты записываются по адресу какой-нибудь переменной такого же размера. Тип переменной не имеет значения.
Если нужно запрашивать переменную именно по идентификатору, можно прошивать во флэш-память опрашивающего м/к список переменных, который создаётся компилятором для прошивки опрашиваемого м/к (.map файл), и вести по нему поиск адреса для запрашиваемой переменной, который затем и передавать в запросе. Можно и наоборот - в запросе передавать идентификатор переменной, а поиск по .map вести на опрашиваемом м/к.
Последний раз редактировалось
wolf 29 дек 2005, 13:45, всего редактировалось 1 раз.
-= Александр =- » 29 дек 2005, 13:42
Тут смотря как удобнее: сразу всю пачку передавать или по-одно? Если в разном порядке или не все нужны в данный момент - лучше на каждую свой запрос делать. А если надо все сразу - просто слать их друг за другом в установленном порядке.
ASin » 29 дек 2005, 14:36
И смотря насколько универсально это должно быть.
Если планируется читать каждый раз один и тот же набор переменных, то пусть слейв на любой запрос на чтение просто последовательно высылает все значения, а мастер пусть их раскладывает куда надо. Можно для приёма такую структуру сделать
- Код: Выделить всё • Развернуть
union inbuf_
{
unsigned char buffer[5];
struct
{
unsigned char A;
unsigned int B;
unsigned int C;
};
} inbuf;
А если планируются разные запросы к слейву, то есть стандартный подход -- передавать ему ID переменной, которую хочется прочитать. В принципе, можно сделать так, что 0x01 -- это переменная A, 0x02- B и т.д., а 0x10 -- это все переменные скопом.
Короче, можно сделать как угодно ;)
40inD » 29 дек 2005, 14:47
Да, планируется читать каждый раз один и тот же набор переменных.
Так что посылка фиксированной структуры на запрос мастера - идеальный вариант. Засада в том, как слейвом передавать несколько байт сразу.
avr123.nm.ru » 29 дек 2005, 15:03
40inD писал(а):Засада в том, как слейвом передавать несколько байт сразу.
да в чем засадо то? как в память передаешь сразу страницу байт за байтом так и делай.
wolf » 29 дек 2005, 15:06
40inD писал(а):Да, планируется читать каждый раз один и тот же набор переменных.
Так что посылка фиксированной структуры на запрос мастера - идеальный вариант. Засада в том, как слейвом передавать несколько байт сразу.
В даташите по шагам расписано, как это делать.
-= Александр =- » 29 дек 2005, 21:41
40inD писал(а):Засада в том, как слейвом передавать несколько байт сразу.
Ну, тут без вариантов, в очередь эыти байты выстроить и через интерфейс передать... :roll: