Подключаем внешнюю флеш-память SD-Card к МиниБоту — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(ссылка на магазин)
 
(не показано 25 промежуточных версий 1 участника)
Строка 1: Строка 1:
 
[[Категория:МиниБот]]
 
[[Категория:МиниБот]]
  
[[Изображение:Распиновка SD-Card.GIF|thumb]]
+
[[Изображение:maket_SD-Card.jpg|thumb]]
[[Изображение:MiniBot - SD-Card.GIF|thumb]]
 
[[Изображение:1.GIF|thumb]]
 
[[Изображение:тест.GIF|thumb]]
 
Паяем переходничек о шести проводках согласно схемы. На самом МиниБоте ничего перепаивать не надо. Эксперементальным путем установлена работоспособность SD-карт при питании 4.1В (но это не говорит о том что и ваши SD-карты такие же не прихотливые ;-)).На крайний случай запускайте МиниБот при разряженом до 3.6В акуумуляторе.
 
Затем честно себе копируем код теста SD-карты. После этого разрешается править данный код на свое усмотрение... :-)))
 
Удачи коллеги в разработке искуственно интеллекта!... :-)))
 
  
<source lang="vb">
+
Писать собственно сильно нечего, всё предельно просто как валенок.<br />
 +
Легким движением руки паяем переходничек о шести проводках согласно схемы. <br />
 +
На самом МиниБоте ничего перепаивать не надо. <br />
 +
Эксперементальным путем установлена работоспособность SD-карт при питании 4.1В (но это не говорит о том что и ваши SD-карты такие же не прихотливые ;-)).На крайний случай на период тестов запускайте МиниБот при разряженом до 3.6В акуумуляторе.<br />
 +
Затем честно себе копируем код теста SD-карты. После этого разрешается править данный код на свое усмотрение... :-)))<br />
 +
Память так же как и сам Минибот и все остальные компоненты можно приобрести здесь http://www.MiniBot.ru <br />
 +
Удачи коллеги в создании искусственного интеллекта!... :-)))<br />
  
$regfile = "m32DEF.dat"
 
$crystal = 11059200
 
$baud = 19200
 
  
'Нога отвечает за Вкл/Откл SD карты в SPI режиме
+
'''Исходники''' [[Медиа:test_SD-Card.rar]]
Config Portb.4 = Output : Chip_select Alias Portb.4
 
  
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4
+
'''Чтение из SD-Card'''
 +
<source lang="vb">
  
Dim Флаг As Bit
+
Sd_address = 0 ; Gosub Read_sd_data  'после чтения данные будут лежать в массиве Sd_data
Dim ФлагПроверкиЗаписи As Bit
 
Dim ФлагДанныеЗаписаныВерно As Bit
 
  
Dim ПринятыйБайт As Byte
+
</source>
Dim Sd_command(6) As Byte
 
'Ответ максимум состоит из 10 байт
 
Dim Size_answer As Byte
 
Dim Sd_answer(10) As Byte
 
Dim Sd_data(512) As Byte
 
  
Dim Tmp_byt1 As Byte
+
'''запись в SD-Card'''
Dim Tmp_byt2 As Byte
+
<source lang="vb">
Dim Tmp_byt3 As Byte
 
  
Dim Count_wrd As Word
+
Sd_address = 0 ; Gosub Clear_sd_buffer   'Очистить буфер для чтения/записи SD карты
  
Dim Tmp_wrd1 As Word
+
  Sd_data(1) = 10
Dim Tmp_wrd2 As Word
+
  Sd_data(2) = 20
 +
  Sd_data(3) = 30
 +
  Sd_data(4) = 40
 +
  Sd_data(5) = 50
 +
  Sd_data(6) = 60
 +
  Sd_data(7) = 70
 +
  Sd_data(8) = 80
 +
  Sd_data(9) = 90
 +
  Sd_data(10) = 100
 +
  ' и так можно до 512
  
Dim Sd_address As Long
+
  Gosub Write_sd_data  'Записать данные в SD карту
  
Print "Старт программы"
+
</source>
  
Begin:
+
[[Изображение:Распиновка SD-Card.GIF|thumb]]
Chip_select = 1 'Отключить SD карту
+
[[Изображение:MiniBot - SD-Card.GIF|thumb]]
'Ответ максимум состоит из 1 байт
+
[[Изображение:1.GIF|thumb]]
Size_answer = 1
+
[[Изображение:тест.GIF|thumb]]
ФлагПроверкиЗаписи = 0
 
Sd_address = &H0
 
 
 
Spiinit 'Инициализация SPI у меги
 
 
 
Gosub Init_sd 'Инициализация SPI у SD карты
 
  
  Do
 
  Gosub Clear_sd_buffer  'Очистить буфер для чтения/записи SD карты
 
  
  Sd_data(1) = 10
 
  Sd_data(2) = 20
 
  Sd_data(3) = 30
 
  Sd_data(4) = 40
 
  Sd_data(5) = 50
 
  Sd_data(6) = 60
 
  Sd_data(7) = 70
 
  Sd_data(8) = 80
 
  Sd_data(9) = 90
 
  Sd_data(10) = 100
 
  
  Gosub Write_sd_data  'Записать данные в SD карту
 
  
  Gosub Read_sd_data  'Прочитать данные из SD карты
 
  
  Sd_address = Sd_address + 512
 
  
  Loop Until Sd_address = 2048
 
End
 
  
'-------------------------------------------------------------------------------
 
  
Init_sd: 'Подпограмма инициализирует SPI у SD карты
 
  
Print "Инициализация SPI у SD карты"
 
  
'Переводим SD карту в SPI режим
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(&Hff)
 
  
Chip_select = 0 'Включить SD карту
 
  
Print "Ресет SD карты"
 
'Послать команду ресет SD карты
 
Sd_command(1) = &H40
 
Sd_command(2) = &H00
 
Sd_command(3) = &H00
 
Sd_command(4) = &H00
 
Sd_command(5) = &H00
 
Sd_command(6) = &H95
 
Gosub Send_sd_command
 
  
Print "Инициализация SD карты"
 
  Do 'Послать команду инициализации SD карты
 
  Sd_command(1) = &H41
 
  Sd_command(2) = &H00
 
  Sd_command(3) = &H00
 
  Sd_command(4) = &H00
 
  Sd_command(5) = &H00
 
  Sd_command(6) = &H55
 
  Gosub Send_sd_command
 
  Waitms 100
 
  Loop Until Sd_answer(1) = 0
 
  
Chip_select = 1 'Отключить SD карту
 
  
Print "Инициализация SPI у SD карты окончена"
 
Return
 
  
Send_sd_command: 'Подпограмма посылает команду SD карте
 
  
ПринятыйБайт = Spimove(&Hff)
 
ПринятыйБайт = Spimove(sd_command(1))
 
ПринятыйБайт = Spimove(sd_command(2))
 
ПринятыйБайт = Spimove(sd_command(3))
 
ПринятыйБайт = Spimove(sd_command(4))
 
ПринятыйБайт = Spimove(sd_command(5))
 
ПринятыйБайт = Spimove(sd_command(6))
 
  
Gosub Receive_sd_command 'Получить ответ от SD карты
 
  
ПринятыйБайт = Spimove(ПринятыйБайт)
 
Return
 
  
Receive_sd_command: 'Подпограмма получает ответ от SD карты
 
  
  Do
 
  ПринятыйБайт = Spimove(&Hff)
 
  Loop Until ПринятыйБайт <> &HFF
 
  
Tmp_byt1 = 0
 
  Do
 
  Incr Tmp_byt1
 
  Sd_answer(tmp_byt1) = ПринятыйБайт
 
  ПринятыйБайт = Spimove(&Hff)
 
  Loop Until ПринятыйБайт = &HFF Or Size_answer = Tmp_byt1
 
  
Print "Ответ SD карты"
 
For Tmp_byt2 = 1 To Tmp_byt1
 
  Print "Байт №" ; Tmp_byt2 ; " = " ; Sd_answer(tmp_byt2)
 
Next
 
Return
 
  
Clear_sd_buffer: 'Подпограмма очищяет буфер для чтения/записи SD карты
 
  
For Count_wrd = 1 To 512
 
  Sd_data(count_wrd) = 0
 
Next
 
Return
 
  
Write_sd_data: 'Подпограмма записывает данные в SD карту по адресу Sd_address размером 512 байт
 
'данные берёт из Sd_data(512)
 
  
  Do
 
  Tmp_byt3 = 0
 
    Do
 
    Флаг = 0
 
    Chip_select = 0    'Включить SD карту
 
  
    Print "Запись"
 
  
    Print "Записать блок данных (512 байт) по адресу " ; Hex(sd_address)
 
  
      Do
 
      Incr Tmp_byt3
 
      Print "Попытка записать данные №" ; Tmp_byt3
 
      Sd_command(1) = &H58  'Послать команду записать блок данных по адресу (sd_address) в SD карту
 
 
      Tmp_wrd1 = Highw(sd_address)
 
      Tmp_wrd2 = Sd_address
 
 
      Sd_command(2) = High(tmp_wrd1)
 
      Sd_command(3) = Low(tmp_wrd1)
 
      Sd_command(4) = High(tmp_wrd2)
 
      Sd_command(5) = Low(tmp_wrd2)
 
      Sd_command(6) = &H55
 
      Gosub Send_sd_command
 
      Loop Until Sd_answer(1) = 0 Or Tmp_byt3 = 5
 
 
    If Sd_answer(1) <> 0 Then
 
      Флаг = 1      'Команда на запись не прошла
 
      Print "Пришёл неверный ответ от команды записи"
 
    Else
 
      Print "Послать данные"
 
      ПринятыйБайт = Spimove(&Hff)      'Послать данные
 
      ПринятыйБайт = Spimove(&Hfe)      'Послать стартовые байты
 
      'Послать данные
 
      For Count_wrd = 1 To 512
 
        ПринятыйБайт = Spimove(sd_data(count_wrd))
 
      Next
 
      'Послать CRC16
 
      ПринятыйБайт = &H55
 
      ПринятыйБайт = Spimove(ПринятыйБайт)
 
      ПринятыйБайт = &H55
 
      ПринятыйБайт = Spimove(ПринятыйБайт)
 
 
      Gosub Receive_sd_command      'Получить ответ от SD карты
 
 
      If Sd_answer(1) <> 229 Then
 
        Sd_answer(1) = 1        'Данные не записались
 
        If Tmp_byt3 = 5 Then
 
          Флаг = 1
 
          Print "Пришёл неверный ответ после записи данных"
 
        End If
 
      Else
 
        ПринятыйБайт = Spimove(&Hff)
 
 
        Chip_select = 1        'Отключить Sd карту
 
 
        ПринятыйБайт = Spimove(&Hff)
 
 
        Chip_select = 0        'Включить SD карту
 
 
        ПринятыйБайт = Spimove(&Hff)
 
 
        Print "Данные успешно записаны"
 
        Sd_answer(1) = 0
 
      End If
 
    End If
 
 
    Chip_select = 1    'Отключить Sd карту
 
    Waitms 10    'Время, которое неоюходимо, для записи данных в SD карту
 
 
    If Флаг = 1 Then
 
      Tmp_byt3 = 0      'Произошла ошибка при записи команды или данных
 
      Gosub Init_sd      'Инициализация SPI у SD карты
 
    End If
 
    Loop Until Флаг = 0 And Sd_answer(1) = 0
 
  ФлагПроверкиЗаписи = 1  'Проверить правильно ли записали
 
  Gosub Read_sd_data  'Прочитать данные из SD карты
 
 
  If ФлагДанныеЗаписаныВерно = 1 Then
 
    Print "Верификация прошла успешно"
 
  Else
 
    Print "Верификация не прошла"
 
  End If
 
  Loop Until ФлагДанныеЗаписаныВерно = 1
 
Return
 
 
Read_sd_data:
 
'Подпограмма читает данные из SD карты по адресу Sd_address размером 512 байт
 
'данные записывает в Sd_data(512)
 
ФлагДанныеЗаписаныВерно = 1
 
 
  Do
 
  Флаг = 0
 
  Chip_select = 0  'Включить SD карту
 
 
  If ФлагПроверкиЗаписи = 1 Then
 
    Print "Верификация"
 
  Else
 
    Print "Чтение"
 
  End If
 
 
  Print "Установить размер блока чтения данных - 512"
 
  'Послать команду установить размер блока 512 в SD карту
 
  Sd_command(1) = &H50
 
  Sd_command(2) = &H00
 
  Sd_command(3) = &H00
 
  Sd_command(4) = &H02
 
  Sd_command(5) = &H00
 
  Sd_command(6) = &H55
 
  Gosub Send_sd_command
 
 
  Print "Прочитать блок данных по адресу " ; Hex(sd_address)
 
  'Послать команду прочитать блок данных по адресу (sd_address) в SD карту
 
 
  Tmp_byt3 = 0
 
    Do
 
    Incr Tmp_byt3
 
    Print "Попытка прочитать данные №" ; Tmp_byt3
 
    Sd_command(1) = &H51
 
 
    Tmp_wrd1 = Highw(sd_address)
 
    Tmp_wrd2 = Sd_address
 
 
    Sd_command(2) = High(tmp_wrd1)
 
    Sd_command(3) = Low(tmp_wrd1)
 
    Sd_command(4) = High(tmp_wrd2)
 
    Sd_command(5) = Low(tmp_wrd2)
 
    Sd_command(6) = &H55
 
    Gosub Send_sd_command
 
    Loop Until Sd_answer(1) = 0 Or Tmp_byt3 = 5
 
 
  If Sd_answer(1) <> 0 Then
 
    Флаг = 1    'Команда на чтение не прошла
 
    Print "Пришёл неверный ответ от команды чтения"
 
  Else
 
    'Получение данных
 
    'Поймать стартовый байт
 
      Do
 
      ПринятыйБайт = Spimove(&Hff)
 
      Loop Until ПринятыйБайт = &HFE
 
    For Count_wrd = 1 To 512    'Получить 512 байт данных
 
      If ФлагПроверкиЗаписи = 1 Then
 
        ПринятыйБайт = Spimove(&Hff)        'Читаем и сравниваем с Sd_data(512)
 
        If ПринятыйБайт <> Sd_data(count_wrd) Then
 
          ФлагДанныеЗаписаныВерно = 0
 
        End If
 
      Else
 
        Sd_data(count_wrd) = Spimove(&Hff)        'Читаем и записываем в Sd_data(512)
 
      End If
 
    Next
 
    'Получить КС
 
    ПринятыйБайт = Spimove(&Hff)
 
    ПринятыйБайт = Spimove(&Hff)
 
 
    Print "Данные успешно считаны"
 
  End If
 
 
  Chip_select = 1  'Отключить Sd карту'
 
 
  If Флаг = 1 Then
 
    'Произошла ошибка при записи команды или данных
 
 
    Gosub Init_sd    'Инициализация SPI у SD карты
 
  End If
 
  Loop Until Флаг = 0
 
ФлагПроверкиЗаписи = 0
 
Return
 
 
</source>
 
  
  

Текущая версия на 09:09, 6 января 2009


Maket SD-Card.jpg

Писать собственно сильно нечего, всё предельно просто как валенок.
Легким движением руки паяем переходничек о шести проводках согласно схемы.
На самом МиниБоте ничего перепаивать не надо.
Эксперементальным путем установлена работоспособность SD-карт при питании 4.1В (но это не говорит о том что и ваши SD-карты такие же не прихотливые ;-)).На крайний случай на период тестов запускайте МиниБот при разряженом до 3.6В акуумуляторе.
Затем честно себе копируем код теста SD-карты. После этого разрешается править данный код на свое усмотрение... :-)))
Память так же как и сам Минибот и все остальные компоненты можно приобрести здесь http://www.MiniBot.ru
Удачи коллеги в создании искусственного интеллекта!... :-)))


Исходники Медиа:test_SD-Card.rar

Чтение из SD-Card <source lang="vb">

Sd_address = 0 ; Gosub Read_sd_data 'после чтения данные будут лежать в массиве Sd_data

</source>

запись в SD-Card <source lang="vb">

Sd_address = 0 ; Gosub Clear_sd_buffer   'Очистить буфер для чтения/записи SD карты

  Sd_data(1) = 10   Sd_data(2) = 20   Sd_data(3) = 30   Sd_data(4) = 40   Sd_data(5) = 50   Sd_data(6) = 60   Sd_data(7) = 70   Sd_data(8) = 80   Sd_data(9) = 90   Sd_data(10) = 100

 ' и так можно до 512

  Gosub Write_sd_data  'Записать данные в SD карту

</source>

Ошибка создания миниатюры: convert: unable to open image `/var/www/vhosts/roboforum.ru/wiki.roboforum.ru/images/f/fb/_SD-Card.GIF': No such file or directory @ error/blob.c/OpenBlob/2589. convert: missing an image filename `/var/www/vhosts/roboforum.ru/wiki.roboforum.ru/images/tmp/transform_1975124a011e.gif' @ error/convert.c/ConvertImageCommand/3015. Error code: 1
MiniBot - SD-Card.GIF
1.GIF
Ошибка создания миниатюры: convert: unable to open image `/var/www/vhosts/roboforum.ru/wiki.roboforum.ru/images/3/3b/.GIF': No such file or directory @ error/blob.c/OpenBlob/2589. convert: no decode delegate for this image format `/var/www/vhosts/roboforum.ru/wiki.roboforum.ru/images/3/3b/.GIF' @ error/constitute.c/ReadImage/532. convert: missing an image filename `/var/www/vhosts/roboforum.ru/wiki.roboforum.ru/images/tmp/transform_80379f7a4520.gif' @ error/convert.c/ConvertImageCommand/3015. Error code: 1