Добавить идентификацию прошивки и чтение EEPROM Бальзам-167
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
#include "periph28335.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
static void response(uint8_t *out, unsigned high, unsigned low)
|
||||
{
|
||||
/* Reply is low data byte, high data byte, then an unrelated timer.
|
||||
* Nonzero timer detects accidentally copying four memory bytes per PEEK. */
|
||||
uint8_t payload[] = {16,56,0,0,0xef,0xbe};
|
||||
payload[2]=(uint8_t)low; payload[3]=(uint8_t)high;
|
||||
assert(periph28335_append_crc(payload,6,out,10)==8);
|
||||
out[8]=out[9]=0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
periph28335_eeprom_reader reader;
|
||||
uint8_t request[8], reply[10], data[2];
|
||||
unsigned i;
|
||||
assert(sizeof(reader)==16);
|
||||
assert(periph28335_eeprom_begin(&reader,16,0,0)==PERIPH28335_ERROR_RANGE);
|
||||
assert(periph28335_eeprom_begin(&reader,0,0,2)==PERIPH28335_ERROR_RANGE);
|
||||
assert(periph28335_eeprom_begin(&reader,16,0x8000,1)==PERIPH28335_ERROR_RANGE);
|
||||
assert(periph28335_eeprom_begin(&reader,16,0x7fff,2)==PERIPH28335_ERROR_RANGE);
|
||||
assert(periph28335_eeprom_begin(&reader,16,1,0xffffffffUL)==PERIPH28335_ERROR_RANGE);
|
||||
assert(periph28335_eeprom_request(&reader,request,8)==0);
|
||||
assert(periph28335_eeprom_begin(&reader,16,1,3)==0);
|
||||
assert(periph28335_eeprom_request(&reader,request,7)==0);
|
||||
assert(periph28335_eeprom_request(&reader,request,8)==8);
|
||||
assert(memcmp(request,"\x10\x38\0\0\0\0",6)==0);
|
||||
response(reply,0x12,0x34);
|
||||
assert(periph28335_eeprom_accept(&reader,reply,8,data,2)==1 && data[0]==0x34);
|
||||
assert(reader.received==1);
|
||||
assert(periph28335_eeprom_request(&reader,request,8)==8 && request[2]==1);
|
||||
reply[2]^=1;
|
||||
assert(periph28335_eeprom_accept(&reader,reply,8,data,2)==PERIPH28335_ERROR_CRC);
|
||||
assert(reader.received==1);
|
||||
response(reply,0x56,0x78);
|
||||
assert(periph28335_eeprom_accept(&reader,reply,8,data,1)==PERIPH28335_ERROR_CAPACITY);
|
||||
assert(reader.received==1);
|
||||
assert(periph28335_eeprom_accept(&reader,reply,10,data,2)==2);
|
||||
assert(data[0]==0x56 && data[1]==0x78 && reader.received==3);
|
||||
assert(periph28335_eeprom_request(&reader,request,8)==0);
|
||||
|
||||
/* Every requested word of a complete dump remains in the EEPROM window.
|
||||
* In particular, neither the RAM route nor selector 0x10000000 is used. */
|
||||
assert(periph28335_eeprom_begin(&reader,16,0,32768)==0);
|
||||
for (i=0;i<16384;i++) {
|
||||
assert(periph28335_eeprom_request(&reader,request,8)==8);
|
||||
assert(request[1]==56 && request[4]==0 && request[5]==0);
|
||||
assert(((unsigned)request[3]*256+request[2])==i);
|
||||
assert(periph28335_crc16_modbus(request,8)==0);
|
||||
response(reply,i>>8,i);
|
||||
assert(periph28335_eeprom_accept(&reader,reply,8,data,2)==2);
|
||||
assert(data[0]==(i>>8) && data[1]==(i&255));
|
||||
}
|
||||
assert(reader.received==32768 && periph28335_eeprom_request(&reader,request,8)==0);
|
||||
assert(periph28335_eeprom_begin(&reader,16,0x7fff,1)==0);
|
||||
assert(periph28335_eeprom_request(&reader,request,8)==8);
|
||||
assert(request[2]==0xff && request[3]==0x3f);
|
||||
response(reply,0x9a,0xbc);
|
||||
assert(periph28335_eeprom_accept(&reader,reply,8,data,2)==1 && data[0]==0xbc);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user