Files
templates/c/set-protocol/tests/test_periph28335_eeprom.c
T

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;
}