реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Помогите прочесь адрес, mega16 + nanopan3561
$ilent
сообщение Feb 27 2006, 12:06
Сообщение #1


Частый гость
**

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



На руках имеется некий трансмиттер нанопар3561 который общается с контроллером по SPI. У него по адресу 0х01 лежит идентификатор встроенного контроллера.
Формат протокола следующий:
<instruction><address><data>
<instruction> - 0x81 - запись одного байта
<instruction> - 0х01 - чтение одного байта
Как я понимаю:

unsigned char nano_data_trans[]=
{
0x01, 0x01
};

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;
}

после отправки инструкции и адреса переменная "pin" должна содержать искомый ответ, но второй конец этой палки заключается в клоках контроллера: их всего два на каждый передаваемый байт, где взять третий для привязки ответа?
Go to the top of the page
 
+Quote Post
ArtemK
сообщение Feb 27 2006, 12:47
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
$ilent
сообщение Feb 27 2006, 13:22
Сообщение #3


Частый гость
**

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



Логика ясна, но не лепа. Что же это получается, если мне нужно прочесть не 1 байт, а 512?
Go to the top of the page
 
+Quote Post
BVU
сообщение Feb 27 2006, 13:33
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
ArtemK
сообщение Feb 27 2006, 13:43
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 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;
  }
}
Go to the top of the page
 
+Quote Post
$ilent
сообщение Mar 20 2006, 13:51
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 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, cool.gif
{
spi_init();
for (i=0; i<a; i++)
{
SPDR = b;
while (!(SPSR & (1<<SPIF)));
}
disable_spi();
}
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 20 2006, 15:49
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
$ilent
сообщение Mar 21 2006, 07:04
Сообщение #8


Частый гость
**

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



Цитата(beer_warrior)
Возможны некоторые неточности, но идея полжна быть ясна.

Спасибки, идея дейсвительно та, поправил - заработало... Спасибо.
Go to the top of the page
 
+Quote Post
$ilent
сообщение Mar 22 2006, 08:08
Сообщение #9


Частый гость
**

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



Подскажите пожалуйста на счёт битов защиты и конфигурации?
Мега16 прочёл биты, контроллер мне выдал - CKSEL0-3 = 1110.
Ни чего не менял кроме CKSEL0-3 = 1111 - установил бит0, после чего контроллер перестал реагировать...
Что случилось и как это вылечить???

Сообщение отредактировал $ilent - Mar 22 2006, 08:09
Go to the top of the page
 
+Quote Post
Igor26
сообщение Mar 22 2006, 09:42
Сообщение #10


Знающий
****

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



Цитата($ilent @ Mar 22 2006, 11:08) *
Подскажите пожалуйста на счёт битов защиты и конфигурации?
Мега16 прочёл биты, контроллер мне выдал - CKSEL0-3 = 1110.
Ни чего не менял кроме CKSEL0-3 = 1111 - установил бит0, после чего контроллер перестал реагировать...
Что случилось и как это вылечить???

Вы настроили Мегу на работу от внешнего кварца. Подключите его и кристалл снова можно программировать.

Сообщение отредактировал Igor26 - Mar 22 2006, 09:44
Go to the top of the page
 
+Quote Post
$ilent
сообщение Mar 22 2006, 10:40
Сообщение #11


Частый гость
**

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



Цитата(Igor26 @ Mar 22 2006, 12:42) *
Вы настроили Мегу на работу от внешнего кварца. Подключите его и кристалл снова можно программировать.

Дык он подключен но не генерит. Остался послединий рабочий МК, надо его заустить от внешнего - боюсь экспериентировать...

Сообщение отредактировал $ilent - Mar 22 2006, 10:42
Go to the top of the page
 
+Quote Post
Igor26
сообщение Mar 22 2006, 11:45
Сообщение #12


Знающий
****

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



Цитата($ilent @ Mar 22 2006, 13:40) *
Цитата(Igor26 @ Mar 22 2006, 12:42) *

Вы настроили Мегу на работу от внешнего кварца. Подключите его и кристалл снова можно программировать.

Дык он подключен но не генерит. Остался послединий рабочий МК, надо его заустить от внешнего - боюсь экспериентировать...

Тогда попробуйте на XTAL1 подать частоту от внешнего источника(пару-тройку мгц.) и снова попробовать запрограммировать. Если у Вас МЕГА в дипе, то мы могли где-нибудь пересечся и я попробовал бы её реанимировать в параллельном программаторе.
Go to the top of the page
 
+Quote Post
$ilent
сообщение Mar 22 2006, 12:03
Сообщение #13


Частый гость
**

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



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

Опа, блин, я биты не установил, а выключил, а это значит External clock. Получается, что если я подам ему внешни генератор, он заведётся?
Go to the top of the page
 
+Quote Post
Igor26
сообщение Mar 22 2006, 12:15
Сообщение #14


Знающий
****

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



Цитата($ilent @ Mar 22 2006, 15:03) *
Цитата(Igor26 @ Mar 22 2006, 14:45) *

Тогда попробуйте на XTAL1 подать частоту от внешнего источника(пару-тройку мгц.) и снова попробовать запрограммировать. Если у Вас МЕГА в дипе, то мы могли где-нибудь пересечся и я попробовал бы её реанимировать в параллельном программаторе.

Опа, блин, я биты не установил, а выключил, а это значит External clock. Получается, что если я подам ему внешни генератор, он заведётся?

Так точно.
Go to the top of the page
 
+Quote Post
$ilent
сообщение Mar 22 2006, 13:36
Сообщение #15


Частый гость
**

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



Цитата(Igor26 @ Mar 22 2006, 15:15) *
Так точно.

уф, один завелся... спасиб мил человек...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016