|
BODLEVEL в ATtiny2313, кто-нить программировал по SPI? |
|
|
|
Nov 14 2006, 13:59
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Цитата(tobias_ivan @ Nov 14 2006, 17:10)  Не могу через последовательный программатор установить нужные значения. Хотя прогрмматор самопальный, но ATmega128 программирует, поэтому собственно сабж? Без проблем и заминок устанавливал с помощью AVReal в паре с STK200/300 Никаких заморочек ни разу не было.
|
|
|
|
|
Nov 14 2006, 20:31
|

Частый гость
 
Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508

|
Цитата(tobias_ivan @ Nov 14 2006, 16:10)  Не могу через последовательный программатор установить нужные значения. Хотя прогрмматор самопальный, но ATmega128 программирует, поэтому собственно сабж? Обратите внимание, что для некоторых процессоров (например, ATmega103, ATmega64, ATmega128) в режиме программирования вместо выводов MOSI, MISO её аппаратного контроллера SPI используются соответственно выводы PDI/RXD и PDO/TXD. http://www.ln.com.ua/~real/avreal/adapters.htmlМожет в этом причина.....
|
|
|
|
|
Nov 15 2006, 06:54
|
Частый гость
 
Группа: Участник
Сообщений: 150
Регистрация: 7-09-05
Из: Россия, г.Новороссийск
Пользователь №: 8 321

|
Цитата Возможно, кривое ПО? Почти 100%... Цитата Так какой программатор то, будете колоться? Я написал - самопальный! Вот фрагмент проги, которая пишет fuse Код spiSend(0xAC); spiSend(0xA0); spiSend(0); spiSend((BYTE)*(*buf+0)); Sleep(50); spiSend(0xAC); spiSend(0xA8); spiSend(0); spiSend((BYTE)*(*buf+1)); Sleep(50); spiSend(0xAC); spiSend(0xA4); spiSend(0); spiSend((BYTE)*(*buf+2)); Повторю - для ATmega128 и ATmega8515 запись проходит, проблема возникла с ATtiny2313. Программируется только Fuse Low Byte... а хочется чтобы и Fuse High Byte, а также Fuse Extended Byte. Может между записями разных Fuse нужно выходить из режима прораммирования?
|
|
|
|
|
Nov 15 2006, 08:21
|
Частый гость
 
Группа: Участник
Сообщений: 150
Регистрация: 7-09-05
Из: Россия, г.Новороссийск
Пользователь №: 8 321

|
Цитата(prottoss @ Nov 15 2006, 10:59)  Да нет, все нормально...Вот только Sleep(50); - это в милисекундах? Точно? Биты можно шить не выходя из режима программирования... Ага. Пишу в C++ Builder 5. В хелпе так сказано: Цитата The Sleep function suspends the execution of the current thread for a specified interval.
VOID Sleep(
DWORD dwMilliseconds // sleep time in milliseconds );
Parameters
dwMilliseconds
Specifies the time, in milliseconds, for which to suspend execution. A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. A value of INFINITE causes an infinite delay.
Return Values
This function does not return a value.
|
|
|
|
|
Nov 17 2006, 06:36
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата Не могу через последовательный программатор установить нужные значения. Хотя прогрмматор самопальный, но ATmega128 программирует, поэтому собственно сабж? Возможно у Вас залочена микруха, и фузы необновляються. Попробуйте стереть и установить. (конечно мало вероятно но всеже) Тин прошил за последний месяц штук 700 (партия). Все ок.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Nov 20 2006, 09:55
|
Частый гость
 
Группа: Участник
Сообщений: 150
Регистрация: 7-09-05
Из: Россия, г.Новороссийск
Пользователь №: 8 321

|
Все решил! Все-таки фузы стали програмироваться после того, как между записью соседних фузов добавил процедуру вхождения в режим программирования. Всем спасибо!  ЗЫ. Кстати, где-то об этом читал, только не помню где...
Сообщение отредактировал tobias_ivan - Nov 20 2006, 09:56
|
|
|
|
|
Nov 20 2006, 18:09
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(tobias_ivan @ Nov 20 2006, 08:55)  Все решил! Все-таки фузы стали програмироваться после того, как между записью соседних фузов добавил процедуру вхождения в режим программирования. Всем спасибо!  ЗЫ. Кстати, где-то об этом читал, только не помню где... Впервые слышу о таком. Всё программирование и всю верификацию делаю на одном входе в программирование (за исключением необходимости перевойти в программирование после стирания - но об этом написано явно в описании процедуры стирания). Вот фрагмент кода avreal Код static void DoWriteFuses(uchar i1, uchar i3) { uchar iobuf[4] = { 0xAC, i1, 0x00, i3 }; Dump4bytes(3, "WriteFuses command", iobuf); SPIio(4, iobuf); Delayus(fuses_delay); Dump4bytes(3, "WriteFuses reply ", iobuf); }
void WriteFuses() { assert(dev_id >= 0); assert(WorkChip()->fuselist != NULL);
os_printf("Programming fuses\n"); // fusein[].mask collected in CollectFuses to OR of all implemented fields for(int i = 0; i < FUSE_SIZE; ++i) { // mask unused bits in fusein[].val to '1' (can be readed as 'x' => must be ignored) fuseout[i].val = uchar((fuseout[i].val & fuseout[i].mask) // requested | ((fusein[i].val | ~fusein[i].mask) & ~fuseout[i].mask)); // read | not_implemented }
fusetype ft = WorkChip()->ftype;
switch (ft) { case F_NONE: // error return;
case F_OLD1: case F_OLD2: DoWriteFuses(uchar((fuseout[0].val & 0xBF) | 0xA0), 0); break;
case F_NEW: fusemask fmask = WorkChip()->fmask; if(fmask & FM_LOW && fuseout[FA_LOW].mask != 0) DoWriteFuses(0xA0, fuseout[FA_LOW].val); if(fmask & FM_HIGH && fuseout[FA_HIGH].mask != 0) DoWriteFuses(0xA8, fuseout[FA_HIGH].val); if(fmask & FM_EXT && fuseout[FA_EXT].mask != 0) DoWriteFuses(0xA4, fuseout[FA_EXT].val); if(fmask & FM_LOCK && fuseout[FA_LOCK].mask != 0) DoWriteFuses(0xE0, fuseout[FA_LOCK].val); break;
} }
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|