BUG
CONST INT DATA_WIDTH := 8;
CONST INT IIC_TIMEOUT := 10;
CONST INT READ :=1;
CONST INT WRITE :=0;
IIC_CheckPresent()(INT Result)
INT ack, error,j,busy;
Result := RESULT_FAIL;
j := 0;
DO WHILE j < IIC_TIMEOUT
IIC_Start()(busy);
IF (!busy) THEN
IIC_Transmit(IIC_ADDRESS | j[0])(ack);
END;
IF (ack || busy) THEN
IIC_Reset();
j := j + 1;
ELSE
j := IIC_TIMEOUT;
END;
END;
IF (ack = 0) THEN
Result := RESULT_PASS;
FOR j := 1 TO DATA_WIDTH
SET SCL := I;
SET SCL := 0;
END;
END;
IIC_Stop();
IIC_Reset();
END;
IIC_FindDevice()(INT Result, INT Address)
INT i ,j, ack, error,busy,z;
Result := RESULT_FAIL;
IIC_Stop();
FOR i := 1 TO 127
j := 0;
DO WHILE j < IIC_TIMEOUT
IIC_Start()(busy);
IF (!busy) THEN
IIC_Transmit((i<<1) | j[0])(ack);
END;
IF (ack || busy) THEN
IIC_Reset();
j := j + 1;
ELSE
j := IIC_TIMEOUT;
END;
END;
IF (busy) THEN
PRINT("IIC Bus not free, can't write address 0x",HEX(i<<1)," to device.\n");
RETURN;
END;
IF (ack = 0 && !busy) THEN
Address := i<<1;
PRINT("IIC device found at address ", Address, " HEX 0x", HEX(Address), "\n");
Result := RESULT_PASS;
END;
IIC_Stop();
END;
END;
IIC_Write( INT byteAddress , INT Length , INT Data )( INT result )
INT ack WIDTH 1;
INT i :=0;
result := RESULT_PASS;
IIC_SetupAddress( byteAddress, WRITE )( result );
IF result THEN RETURN; END;
IF Length > 0 THEN
DO
IF DEBUG THEN PRINT("Writing to byte address 0x",HEX(byteAddress),"\n"); END;
IIC_Transmit( Data[(((i+1)*DATA_WIDTH)-1)..(i*DATA_WIDTH)])( ack );
IF(ack = 1) THEN
PRINT("IIC_Write Error: Interface failed to acknowledge data.\n");
RETURN;
END;
byteAddress := byteAddress + 1;
i := i + 1;
WHILE( i != Length )
IF (( byteAddress & ( IIC_WRITE_PAGE_SIZE- 1)) = 0) THEN
IIC_Stop();
IIC_SetupAddress( byteAddress , WRITE )( result );
IF result THEN RETURN; END;
END;
END;
END;
IIC_Stop();
result := RESULT_PASS;
END;
IIC_Read( INT byteAddress , INT Length )( INT Data, INT result )
INT value;
INT i :=0, end :=FALSE;
result := RESULT_PASS;
Data :=0;
IIC_SetupAddress( byteAddress, READ )( result );
IF result THEN RETURN; END;
DO
IF DEBUG THEN PRINT("Ready to read from byte address 0x",HEX(byteAddress),"\n"); END;
byteAddress := byteAddress + 1;
i := i + 1;
end := FALSE;
IF ( ( i = Length ) | (( byteAddress & ( IIC_READ_PAGE_SIZE -1)) = 0) ) THEN
end := TRUE;
END;
IIC_Receive( end )( value ) ;
Data[((i*DATA_WIDTH)-1)..((i-1)*DATA_WIDTH)] := value;
WHILE( i != Length )
IF (( byteAddress & ( IIC_READ_PAGE_SIZE -1)) = 0) THEN
IIC_Stop();
IIC_SetupAddress( byteAddress, READ )( result );
IF result THEN RETURN; END;
END;
END;
IIC_Stop();
END;
IIC_SetupAddress( INT byteAddress , INT read)( INT result )
INT ack WIDTH 1;
INT i :=0, busy, shift;
INT IIC_ADDR := IIC_ADDRESS | (byteAddress>>(IIC_ADDRESS_BYTES * DATA_WIDTH))<<1 ;
result := RESULT_FAIL;
DO WHILE i < IIC_TIMEOUT
IIC_Start()(busy);
IF (!busy) THEN
IIC_Transmit(IIC_ADDR)(ack);
END;
IF (ack || busy) THEN
IIC_Stop();
i := i + 1;
ELSE
i := IIC_TIMEOUT;
END;
END;
IF (busy) THEN
PRINT("IIC Bus not free, can't write address to device, ",DEVICE_REF,".\n");
RETURN;
END;
IF (ack = 1) THEN
PRINT("IIC Error: ",DEVICE_REF," failed to acknowledge device address.\n");
RETURN;
END;
FOR i := 1 FOR IIC_ADDRESS_BYTES
shift := ( (IIC_ADDRESS_BYTES - i) * DATA_WIDTH);
IIC_Transmit( byteAddress >> shift )( ack );
IF(ack = 1) THEN
PRINT("IIC Error: ",DEVICE_REF," failed to acknowledge address.\n");
RETURN;
END;
END;
IF (read = READ) THEN
IIC_Start()(busy);
IIC_Transmit( IIC_ADDR | READ )( ack );
END;
result := RESULT_PASS;
END;
IIC_Transmit(INT byte)(INT ack)
INT i;
FOR i := 1 FOR DATA_WIDTH
IIC_WriteBit( byte[DATA_WIDTH - i] );
END;
IIC_ReadBit()(ack);
IF DEBUG THEN PRINT("Wrote := 0x",HEX(byte),"\n"); END;
END;
IIC_Receive(INT ack)(INT byte WIDTH DATA_WIDTH)
INT i, bit WIDTH 1;
byte := 0;
FOR i := 1 FOR DATA_WIDTH
IIC_ReadBit()(bit);
byte[DATA_WIDTH - i] := bit;
END;
IIC_WriteBit(ack)();
IF DEBUG THEN PRINT("Read := 0x",HEX(byte),"\n"); END;
END;
IIC_Reset()()
INT i, d := 0;
SET SDA := I;
DO
SET SCL := I;
SET d := SDA;
i := i + 1;
WHILE (i < 10) && d =0
SET SCL := 0;
END;
END;
IIC_Start()(INT error)
INT c, d ;
error := FALSE;
IF READABLE(SCL) THEN
SET c := SCL, d := SDA;
IF (~c || ~d) THEN
SET c := SCL, d := SDA;
END;
IF (~c || ~d) THEN
error := TRUE;
RETURN;
END;
ELSE
SET d := SDA, SCL := I;
IF (~d) THEN
SET d := SDA;
END;
IF (~d) THEN
error := TRUE;
RETURN;
END;
END;
SET SDA := 0;
SET SCL := 0;
IF DEBUG THEN PRINT("Start.\n");END;
END;
IIC_Stop()()
SET SDA := 0;
SET SCL := I;
SET SDA := I;
IF DEBUG THEN PRINT("Stop.\n");END;
END;
IIC_ReadBit()(INT bit)
SET SDA := I;
SET SCL := I;
SET SCL := 0, bit := SDA;
IF DEBUG THEN PRINT("Read ", bit, ".\n");END;
END;
IIC_WriteBit(INT bit)()
IF (bit[0]) THEN
SET SDA := I;
ELSE
SET SDA := 0;
END;
SET SCL := I;
SET SCL := 0;
IF DEBUG THEN PRINT("Wrote ", bit, ".\n");END;
END;
IIC_Write_Bin_File(FILE fp, INT filepos, INT Address, INT Length)( INT result )
INT i, data, amount, filelength;
result := RESULT_PASS;
i := Length;
FSEEK(fp,0,2);
FTELL(fp)(filelength);
filelength := (filelength / DATA_WIDTH) - filepos;
IF (Length > filelength) THEN
i := filelength;
END;
FSEEK(fp,DATA_WIDTH * filepos,0);
DO
IF (i >= IIC_WRITE_PAGE_SIZE) THEN
amount := IIC_WRITE_PAGE_SIZE;
ELSE
amount := i;
END;
FGETI(fp,DATA_WIDTH*amount)(data);
IIC_Write( Address , amount , data )( result );
IF result THEN RETURN; END;
i := i - amount;
Address := Address + amount;
WHILE ( i > 0);
END;
END;
IIC_Read_Bin_File(FILE fp, INT filepos, INT Address, INT Length)( INT result )
INT i,data, amount;
result := RESULT_PASS;
i := Length;
FSEEK(fp,DATA_WIDTH * filepos,0);
DO
IF (i >= IIC_READ_PAGE_SIZE) THEN
amount := IIC_READ_PAGE_SIZE;
ELSE
amount := i;
END;
IIC_Read( Address , amount )( data, result );
IF result THEN RETURN; END;
FWRITE(fp,data[((DATA_WIDTH*amount)-1)..0]);
i := i - amount;
Address := Address + amount;
WHILE ( i > 0);
END;
END;
IIC_Verify_Bin_File(STRING ProgFileName)(INT Result)
INT ProgFileLength, ProgFileLengthBytes, ProgData, ReadData, i;
FILE ProgFile, ReadFile;
FOPEN(ProgFileName,"r")(ProgFile);
FSEEK(ProgFile,0,2);
FTELL(ProgFile)(ProgFileLength);
IF DEBUG THEN
PRINT("ProgFileLength := ",ProgFileLength,"\n");
END;
ProgFileLengthBytes := ProgFileLength / DATA_WIDTH;
FOPEN("temp.bin","w+")(ReadFile);
IIC_Read_Bin_File(ReadFile, 0, 0, ProgFileLengthBytes)( Result );
IF Result THEN RETURN; END;
FSEEK(ProgFile,0,0);
FSEEK(ReadFile,0,0);
FGETI(ProgFile,ProgFileLength)(ProgData);
FGETI(ReadFile,ProgFileLength)(ReadData);
FOR i := 0 FOR ProgFileLengthBytes
IF DEBUG THEN
PRINT("PData := 0x",HEX(ProgData[(i*DATA_WIDTH)+7..i*DATA_WIDTH]),"\tRData := 0x",HEX(ReadData[(i*DATA_WIDTH)+7..i*DATA_WIDTH]),"\n");
END;
IF ProgData[(i*DATA_WIDTH)+7..i*DATA_WIDTH] != ReadData[(i*DATA_WIDTH)+7..i*DATA_WIDTH] THEN
PRINT("Verify Failed at address 0x",HEX(i),": Expected := 0x",HEX(ProgData[(i*DATA_WIDTH)+7..i*DATA_WIDTH])," Read := 0x",HEX(ReadData[(i*DATA_WIDTH)+7..i*DATA_WIDTH]),"\n");
FCLOSE(ReadFile);
FCLOSE(ProgFile);
Result := RESULT_FAIL;
RETURN;
END;
END;
FCLOSE(ReadFile);
FCLOSE(ProgFile);
END;