Вдруг кому пригодится. Задача - быстро загружать даные в 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