|
Помогите прочесь адрес, mega16 + nanopan3561 |
|
|
|
Feb 27 2006, 12:47
|
Участник

Группа: Свой
Сообщений: 36
Регистрация: 27-09-05
Из: Украина, г. Херсон
Пользователь №: 8 994

|
Отправляйте на SPI и третий байт. Когда контроллер будет выталкивать на MOSI третий байт, из MISO в приемный буфер затолкнется ваша <data> от трансмиттера. Т.е. Ваш код нужно модифицировать, например так:
unsigned char nano_data_trans[]= { 0x01, 0x01, 0x00 };
char i; char pin; char len_nano_data = sizeof(nano_data_trans) / sizeof(nano_data_trans[0]);
void int0_isr(void) { spi_init(); for ( i=0; i<len_nano_data; i++) { SPDR = nano_data_trans[i]; while (!(SPSR & (1<<SPIF))); } pin = SPDR; }
|
|
|
|
|
Feb 27 2006, 13:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата($ilent @ Feb 27 2006, 16:22)  Логика ясна, но не лепа. Что же это получается, если мне нужно прочесть не 1 байт, а 512? Все 'лепо', почитайте как работает SPI. http://www.mct.net/faq/spi.htmlВы должны управлять ведомым (Slave) по SCK от ведущий (Master), что бы получить ответные данные (идеология Master-Slave). Передачу данных может инициализировать только ведущий SPI.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Feb 27 2006, 13:43
|
Участник

Группа: Свой
Сообщений: 36
Регистрация: 27-09-05
Из: Украина, г. Херсон
Пользователь №: 8 994

|
Цитата Что же это получается, если мне нужно прочесть не 1 байт, а 512? Например вот так, если не использовать прерывания. В функцию передается указатель на буфер и кол-во читаемых байт. Код void SPIReadNBytes(char Buffer[], const unsigned short Length) { unsigned short i; for (i = 0; i < Length; i++) { SPDR = 0x00; while (!(SPSR & (1<<SPIF))); Buffer[i] = SPDR; } }
|
|
|
|
|
Mar 20 2006, 13:51
|

Частый гость
 
Группа: Новичок
Сообщений: 116
Регистрация: 14-02-06
Из: Москва. Перово
Пользователь №: 14 296

|
Появился новый вопрос: есть некий массив и его длинна, как передать в функцию для отправки по SPI это массив? просто записью SPDR = trans[i]; не пойдёт - таких массивов несколько, т.е. хочу эот отправлю, хочу другой. Код ниже передаёт длинну и первую ячейку массива... =( unsigned char trans[]= { 0x81, 0x03, 0x86, //Power On/Off 16 MHz Clock and Quartz 0x81, 0x04, 0x00, //Reset Digital Baseband and 16 MHz Clock 0x81, 0x29, 0x80, //External Power Amplifier Controls 0x81, 0x34, 0x4B, //RF Local Oscillator Controls }; char len_trans = sizeof(trans) / sizeof(trans[0]); // размер массива init #pragma interrupt_handler int0_isr:2 void int0_isr(void) { transmit(len_trans, trans[i]); } void transmit(a,  { spi_init(); for (i=0; i<a; i++) { SPDR = b; while (!(SPSR & (1<<SPIF))); } disable_spi(); }
|
|
|
|
|
Mar 20 2006, 15:49
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Код void transmit(char* p, int len) { while(len) //пока длина не ноль { while (!(SPSR & (1<<SPIF))); //проверили готовность SPDR = *p; // отравить данные по адресу р p++; // след. адрес i--; // уменьшить длину } }
main() { char array_A[] = {...}; char array_B[] = {...};
transmit(char array_A, sizeof(char array_A)); transmit(char array_B, sizeof(char array_B));
} Возможны некоторые неточности, но идея полжна быть ясна.
Сообщение отредактировал beer_warrior - Mar 20 2006, 15:51
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 21 2006, 07:04
|

Частый гость
 
Группа: Новичок
Сообщений: 116
Регистрация: 14-02-06
Из: Москва. Перово
Пользователь №: 14 296

|
Цитата(beer_warrior) Возможны некоторые неточности, но идея полжна быть ясна. Спасибки, идея дейсвительно та, поправил - заработало... Спасибо.
|
|
|
|
|
Mar 22 2006, 10:40
|

Частый гость
 
Группа: Новичок
Сообщений: 116
Регистрация: 14-02-06
Из: Москва. Перово
Пользователь №: 14 296

|
Цитата(Igor26 @ Mar 22 2006, 12:42)  Вы настроили Мегу на работу от внешнего кварца. Подключите его и кристалл снова можно программировать. Дык он подключен но не генерит. Остался послединий рабочий МК, надо его заустить от внешнего - боюсь экспериентировать...
Сообщение отредактировал $ilent - Mar 22 2006, 10:42
|
|
|
|
|
Mar 22 2006, 12:03
|

Частый гость
 
Группа: Новичок
Сообщений: 116
Регистрация: 14-02-06
Из: Москва. Перово
Пользователь №: 14 296

|
Цитата(Igor26 @ Mar 22 2006, 14:45)  Тогда попробуйте на XTAL1 подать частоту от внешнего источника(пару-тройку мгц.) и снова попробовать запрограммировать. Если у Вас МЕГА в дипе, то мы могли где-нибудь пересечся и я попробовал бы её реанимировать в параллельном программаторе. Опа, блин, я биты не установил, а выключил, а это значит External clock. Получается, что если я подам ему внешни генератор, он заведётся?
|
|
|
|
|
Mar 22 2006, 12:15
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата($ilent @ Mar 22 2006, 15:03)  Цитата(Igor26 @ Mar 22 2006, 14:45)  Тогда попробуйте на XTAL1 подать частоту от внешнего источника(пару-тройку мгц.) и снова попробовать запрограммировать. Если у Вас МЕГА в дипе, то мы могли где-нибудь пересечся и я попробовал бы её реанимировать в параллельном программаторе.
Опа, блин, я биты не установил, а выключил, а это значит External clock. Получается, что если я подам ему внешни генератор, он заведётся? Так точно.
|
|
|
|
|
Mar 22 2006, 13:36
|

Частый гость
 
Группа: Новичок
Сообщений: 116
Регистрация: 14-02-06
Из: Москва. Перово
Пользователь №: 14 296

|
Цитата(Igor26 @ Mar 22 2006, 15:15)  Так точно. уф, один завелся... спасиб мил человек...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|