/* * I2CSPI.c - algorithms to interface generic I2C/SPI devices * Copyright (C) 2010-2022 Alberto Maccioni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA * or see */ //configure for GUI or command-line #include "common.h" #ifdef __GTK_H__ #define _GTKGUI #endif #ifdef _GTKGUI #define printM(id) PrintMessageI2C(id); #else #define printM(id) printf(id); #endif #define CS 8 #define HLD 16 void I2CReceive(int mode,int speed,int N,BYTE *buffer) // I2C/SPI receive // mode: // 0 = I2C 8bit // 1 = I2C 16bit // 2 = SPI 00 // 3 = SPI 01 // 4 = SPI 10 // 5 = SPI 11 // speed: // 0 = 100 kbps // 1 = 200 kbps // 2 = 300/400 kbps (SPI/I2C) // 3 = 500/800 kbps (SPI/I2C) { int j=0; if(N<0) N=0; if(N>60) N=60; if(mode<0) mode=0; if(mode>5) mode=5; if(speed<0) speed=0; if(speed>3) speed=3; if(saveLog){ OpenLogFile(); //"Log.txt" fprintf(logfile,"I2C-SPI receive\tmode=%d\tspeed=%d\n",mode,speed); } bufferU[j++]=VREG_DIS; //Disable HV reg bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; if(mode<2){ //I2C mode bufferU[j++]=I2C_INIT; bufferU[j++]=(speed<<3)+(speed>0?0x40:0); //enable slew control if >100k } else{ //SPI mode bufferU[j++]=EXT_PORT; //CS=1 bufferU[j++]=CS; bufferU[j++]=0; bufferU[j++]=EXT_PORT; //CS=0 bufferU[j++]=0; bufferU[j++]=0; bufferU[j++]=SPI_INIT; bufferU[j++]=speed+((mode-2)<<2); } bufferU[j++]=FLUSH; for(;j(DIMBUF-4)?DIMBUF-4:N; bufferU[j++]=buffer[0]; //Control byte bufferU[j++]=buffer[1]; //Address; } else if(mode==1){ //I2C read 16bit bufferU[j++]=I2C_READ2; bufferU[j++]=N>(DIMBUF-4)?DIMBUF-4:N; bufferU[j++]=buffer[0]; //Control byte bufferU[j++]=buffer[1]; //Address H; bufferU[j++]=buffer[2]; //Address L; } else if(mode>=2){ //SPI read bufferU[j++]=SPI_READ; bufferU[j++]=N>(DIMBUF-5)?DIMBUF-5:N; bufferU[j++]=EXT_PORT; //CS=1 bufferU[j++]=CS; bufferU[j++]=0; } bufferU[j++]=FLUSH; for(;j0xFA){ printM(strings[S_InsErr]); //"unknown instruction" } else{ char str[1024]=""; char t[16]=""; int i; if(mode==0) sprintf(str,"> %02X %02X\r\n",bufferU[2],bufferU[3]); else if(mode==1) sprintf(str,"> %02X %02X\r\n",bufferU[2],bufferU[3]); strcat(str,"< "); for(i=0;i57) N=57; if(mode<0) mode=0; if(mode>5) mode=5; if(speed<0) speed=0; if(speed>3) speed=3; if(saveLog){ OpenLogFile(); //"Log.txt" fprintf(logfile,"I2C-SPI send\tmode=%d\tspeed=%d\n",mode,speed); } bufferU[j++]=VREG_DIS; //Disable HV reg bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; if(mode<2){ //I2C mode bufferU[j++]=I2C_INIT; bufferU[j++]=(speed<<3)+(speed>0?0x40:0); //enable slew control if >100k } else{ //SPI mode bufferU[j++]=EXT_PORT; //CS=1 bufferU[j++]=CS; bufferU[j++]=0; bufferU[j++]=EXT_PORT; //CS=0 bufferU[j++]=0; bufferU[j++]=0; bufferU[j++]=SPI_INIT; bufferU[j++]=speed+((mode-2)<<2); } bufferU[j++]=FLUSH; for(;j(DIMBUF-5)?DIMBUF-5:N; bufferU[j++]=buffer[0]; //Control byte bufferU[j++]=buffer[1]; //Address for(i=0;i(DIMBUF-5)?DIMBUF-5:N+1; bufferU[j++]=buffer[0]; //Control byte bufferU[j++]=buffer[1]; //Address bufferU[j++]=buffer[2]; //Address L for(i=0;i=2){ //SPI write bufferU[j++]=SPI_WRITE; bufferU[j++]=N>(DIMBUF-5)?DIMBUF-5:N; for(i=0;i0xFA){ printM(strings[S_InsErr]); //"unknown instruction" } else{ char str[1024]; char t[16]; int n=2; int i; sprintf(str,"> "); if(mode<2) n=4; for(i=0;i