65 lines
3.0 KiB
C
65 lines
3.0 KiB
C
#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;
|
|
}
|