Цитата(Wic @ Feb 6 2012, 18:56)

Если загрузить прошивку через бластер, читать-писать из ниоса во флэшку получается?
Для ниоса тестовую прогу для доступа к памяти не писал. Я проверил с помощью System console - читает, пишет и стирает. Все отлично. Причем в качестве мастера в консоли используется процессор (его я предварительно остановил) .Т.е. у меня такой скрипт:
Код
processor_stop [ lindex [ get_service_paths processor ] 0 ]
set master [ lindex [ get_service_paths master] 0 ]
open_service master $master
#**************** procidures************************
# ----READ STATUS REGISTER--------
proc ReadSR {master} {
master_write_8 $master 0x03000000 0x70
set SR [master_read_16 $master 0x03000000 1]
if {[expr $SR&0x01]} {puts "SR INFO: BEFP in progress"}
if {[expr $SR&0x02]} {puts "SR ERROR: Block locked! operation aborted"}
if {[expr $SR&0x04]} {puts "SR INFO: Program suspend in effect"}
if {[expr $SR&0x08]} {puts "SR ERROR: Vpp<Vpplk during program or erase!"}
if {[expr $SR&0x10]} {puts "SR ERROR: Program fail"}
if {[expr $SR&0x20]} {puts "SR ERROR: Erase fail"}
if {[expr $SR&0x40]} {puts "SR INFO: Erase suspend in effect"}
return $SR}
# ----END READ STATUS REGISTER--------
proc ClearSR {master} {master_write_8 $master 0x03000000 0x50}
proc BlockUnlock {master addr} {
master_write_8 $master [expr 0x03000000+$addr] 0x60
master_write_8 $master [expr 0x03000000+$addr] 0xd0 }
proc EraseBlock {master addr} {
master_write_8 $master [expr 0x03000000+$addr] 0x20
master_write_8 $master [expr 0x03000000+$addr] 0xd0 }
# ---------LED blinking---------------------
puts "Start led blink"
set val 0
set j 0
for {set i 400} {$i!=0} {incr i -1} {
master_write_8 $master 0x4004940 $val
incr j
if {$j==100} {
set val [expr $val^0x01]
set j 0
}
}
puts "finish led blink"
# ---------END LED blinking---------------------
# ----READ RCR( Read config reg)--------
master_write_8 $master 0x03000000 0x90
set cont [master_read_16 $master [expr 0x03000000+0x05*2] 1]
puts "RCR=$cont"
# ----END READ RCR( Read config reg)--------
puts "SR=[ReadSR $master]"
ClearSR $master
BlockUnlock $master 0
EraseBlock $master 0
while {[expr [ReadSR $master]&0x80]!=0x80} {}
# ----WORD PROGRAM--------
for {set i 0} {$i<10} {incr i} {
master_write_8 $master 0x03000000 0x40
master_write_16 $master [expr 0x03000000+$i*2] [expr 0x1234+$i]
}
# ----END WORD PROGRAM--------
puts "SR=[ReadSR $master]"
master_write_8 $master 0x03000000 0xff
set cont [master_read_16 $master [expr 0x03000000+0x00*2] 10]
puts "$cont"
close_service master $master
При запуске скрита светодиод на плате несколько раз моргает, а затем в окне вывода пишет:
Код
Start led blink
finish led blink
RCR=0xbfcf
SR=0x0080
SR=0x0080
0x1234 0x1235 0x1236 0x1237 0x1238 0x1239 0x123a 0x123b 0x123c 0x123d
Если в скрипте оставляю только чтение и выключаю/включаю плату, то содержимое флэш правильное. Т.е. запись проходит. И запись с использованием ниоса и всей qsys - системой. Интересно механизм записи с использованием команды nios2-flash-programmer другой, нежели у меня с использованием system console?
PS. У меня в скрипте адрес 0x3000000 - это адрес флэш в адресном пространстве системы.
UPD. При использовании nios2-flash-programmer 2 первых слова все-таки записываются, а дальше нет. Это я содержимое flash после программера смотрю в консоли.