Автор Тема: Скоростная запись в I2C EEPROM через гипертерминал  (Прочитано 3736 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1769
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Вдруг кому пригодится. Задача - быстро загружать даные в I2c EEPROM типа 24с256. Все примеры в рунете и глобальной сети пишут в епромку по одному байту, что получается очень уныло и долго. Скорость состовляет где-то 200 байт в секунду. Повысить скорость записи в 10 раз можно пися данные в память странично - 24с256 позволяет отправить ей сразу 64 байта, а потом подождать стандартные 5 ms. Ну и до кучи, если лень писать свои программы загрузки через COM порт, можно взять код загрузчика из помощи Bascom по протокоу X-modem и грузить данные через Гипертерминал windows xp или  любой другой поддерживающий xmodem.

Сам код -

Цитировать

\'Программа загрузки памяти
\'Автор - Andy
\'http://minilabmaster.com
$crystal = 11059200                                         \'Кварц- 11,0592 МГц          .
$regfile = "m32def.dat"
$hwstack = 70                                               \' Размер аппаратного стека
$swstack = 8                                                \' Размер программного стека
$framesize = 22   


\'------Конфигурация I2C шины
$lib "I2C_TWI.LBX"                                          \'Setting up i2c hardware bus
Config Twi = 400000                                         \'Hardware i2c bus speed
Config Scl = Portc.0                                        \'TWI (i2c) ports on the Mega128
Config Sda = Portc.1
Const 24c256w0 = &B10100000                                  \'slave write address eeprom
Const 24c256r0 = &B10100001
Dim Indata(256) As Byte                                     \'Буфер входных данных
Dim Bstatus As Byte
Dim Bretries As Byte
Dim Csum As Byte
Dim J As Byte
Dim Bblocklocal As Byte
Dim Bblock As Byte
Dim Bcsum1 As Byte
Dim Bcsum2 As Byte
Dim Adrs As Word

Const Enq = &H5
Const Stx = &H2
Const Nak = &H15
Const _ack = &H06
Const Can = &H18


Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Baud = 57600
Cls
LCD "Speed - 57600"


$timeout = 1000000
Adrs = 0
Disable Interrupts

For J = 1 To 3                                              \'simple indication

  Toggle Porta.2 : Waitms 500 : Toggle Porta.2

Next



Bretries = 10                                               \'number of retries

Do
 Csum = 0                                                   \'checksum is 0 when we start
 Printbin Nak                                               \' firt time send a nack

Do
   Bstatus = Waitkey()                                      \'ожитание статусного байта

  Select Case Bstatus
     Case &H1:                                              \'start of heading, PC is ready to send
      Incr Bblocklocal                                      \'increase local block count
      Csum = 1                                              \'checksum is 1
      Bblock = Waitkey() : Csum = Csum + Bblock             \'get block
\'      Lcd Bblock
      Bcsum1 = Waitkey() : Csum = Csum + Bcsum1             \'get checksum first byte

        For J = 1 To 128                                    \'get 128 bytes
             Indata(j) = Waitkey() : Csum = Csum + Indata(j)
        Next
      Bcsum2 = Waitkey()                                    \'get second checksum byte
        If Bblocklocal = Bblock Then                        \'are the blocks the same?
             If Bcsum2 = Csum Then                          \'is the checksum the same?
                 Gosub Writepage                            \'yes go write the page
                 Printbin _ack                              \'acknowledge

                Else                                        \'no match so send nak
                Cls
                 Lcd "nak"
                  Printbin Nak
              End If
          Else
               Cls
                 Lcd "nak"
              Printbin Nak                                  \'blocks do not match
        End If
    Case &H4:                                               \' end of transmission , file is transmitted
       Printbin _ack                                        \' send ack and ready
       Cls
       Lcd "End File"
       Gosub Pik
       Wait 3                                               \'
       Goto _reset                                          \' start new program

    Case &H18:                                              \' PC aborts transmission
       Cls
       Lcd "Abort!"
       Wait 3
       Goto _reset                                          \' ready

   Case Else
     Exit Do                                                \' no valid data
  End Select
Loop




If Bretries <> 0 Then                                       \'attempte left?
    Waitms 1000
    Decr Bretries                                           \'decrease attempts
  Else

       Cls
       Lcd "CRC!!!"
       Wait 3
    Goto _reset                                             \'reset chip
End if

Loop
Return
« Последнее редактирование: 16 Ноябрь 2011, 14:56:23 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1769
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Цитировать

Writepage:
Ukaz = 0

Gosub Writepagecik
Gosub Writepagecik
Toggle Portd.5 : Waitms 10 : Toggle Portd.5
Return

Writepagecik:
Nm = Adrs + 63

I2cstart
I2cwbyte 24c256w0
Tempadress = High(adrs)
I2cwbyte Tempadress                                         \'highbyte adress of EEPROM
Tempadress = Low(adrs)
I2cwbyte Tempadress


For Adrs = Adrs To Nm
  Incr Ukaz
  Value = Indata(ukaz)                                      \'slave address (read)
  I2cwbyte Value
Next

I2cstop
Waitms 5
Return


« Последнее редактирование: 16 Ноябрь 2011, 14:56:48 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1769
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Естественно, в данном примере вы можете записать в данную микруху файл размером не более 32 килобайта, но можно подключать такие микрухи парралельно, выставив ножками другой адрес- до 8-ми чипов. Для адресации другого чипа переменную инициализации адреса надо менять, например так:

Const 24c256w0 = &B10100000                                 \'0chip
Const 24c256w1 = &B10100010                                 \'1chip
Const 24c256w2 = &B10100100                                 \'2chip
Const 24c256w3 = &B10100110                                 \'3chip
...

то есть меняются три байта - с пятого по седьмой, номер чипа в двойничной системе.
« Последнее редактирование: 23 Январь 2014, 07:14:52 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Форум проекта "Минилаб-Мастер"