All measures are done with with a simple not calibrated multimeter, the negative probe on ground. Internal resistance of this instrument is not specified, but I expect several 100kOhm.
Length of trace from BRA and BRB to the PTHhole connecting the groundplate on the downside of doublesided print is about 1.5 mm.
The code I used is applicated on an arduinouno processor; I did not translate all of my comments (in Dutch) Iām sorry that it might be a little boring.
#define MS1 A3 //PC3 pin 26
#define MS2 A4 //PC4 pin 27
#define UART_TCM2226 A5 //PC5 pin 28
#define ENABLe 8 //PB0 pin14
#define STAP 9 //PB1 pin15
#define ROOD 6 //PD6 pin12
#define GROEN 5 //PD5 pin11
#define RICHTING 10 //PB2 pin16
#define UCHAR byte
#define AAN digitalWrite(ENABLe,LOW);
#define UIT digitalWrite(ENABLe,HIGH);
#define PRINT(b) {Serial.print(b); Serial.flush();}
#define ROODAAN digitalWrite(ROOD,HIGH);
#define ROODUIT digitalWrite(ROOD,LOW);
/************************************************************************************/
void setup() {
Serial.begin(9600);
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(UART_TCM2226, OUTPUT);
pinMode(ENABLe, OUTPUT);
pinMode(STAP, OUTPUT);
pinMode(RICHTING, OUTPUT);
pinMode(ROOD, OUTPUT);
digitalWrite (MS1, 0);
digitalWrite (MS2, 0);
digitalWrite (ENABLe, 1);
digitalWrite (STAP, 1);
digitalWrite (RICHTING, 1);
digitalWrite (UART_TCM2226, 1);
instrueren();
ROODAAN
}
/************************************************************************************/
void instrueren(){ /DATASHEET pag 20 en 15 en 53/
UCHAR instructies[8];
instructies[0] = B10100000; //synchronisatie
instructies[1] = B00000000; //slave adres (MS1=0; MS2 =0 )
instructies[2] = B00000001; //register adres 0x00(GCONF); interne weerstanden;send
instructies[3] = 0;
instructies[4] = 0;
instructies[5] = 0;
instructies[6] = B00000010; //lowest databytes; interne weerstanden
swuart_calcCRC (instructies,(byte)8); //checksum berekenen
int i, j;
byte instructieregel;
for (i=0; i<8; i++) { //ter controle
PRINT(i);
PRINT(" ");
instructieregel = instructies[i];
PRINT(" 0 ");
for (j=0; j<8; j++) {
Serial.print ((instructieregel & 0x80)? "1" : "0");
Serial.flush();
instructieregel = instructieregel << 1;
}
PRINT(" 1\n");
}
for (i=0; i<8; i++) { //instructie doorgeven
instructieregel = instructies[i];
digitalWrite (UART_TCM2226, 0); //start van een byte
delayMicroseconds (5);
for (j=0; j<8; j++) {
digitalWrite (UART_TCM2226, (instructieregel & 0x80)? 1 : 0);
instructieregel = instructieregel << 1;
delayMicroseconds (5);
}
digitalWrite (UART_TCM2226, 1); //einde van een byte
delayMicroseconds (5);
}
}
/***********************************************************************************/
/
De volgende functie is lettelijk overgenomen uit pagina 17 van TMC2226 DATASHEET(Rev. 1.06/ 2020-MAY-18)
/
void swuart_calcCRC (UCHAR datagram, UCHAR datagramLength){
int i, j;
UCHAR * crc = datagram + (datagramLength-1); //
UCHAR currentByte;
*crc = 0;
for (i=0; i<(datagramLength-1); i++) {
currentByte = datagram[i];
for (j=0; j<8; j++){
if ((*crc >> 7) ^ (currentByte&0x01))
*crc = (*crc <<1) ^ 0x07;
else
*crc = (*crc << 1) ;
currentByte = currentByte >> 1;
}
}
}
/************************************************************************************/
void loop() {
char txt;
if (Serial.available()) { //willekeurige input als de seriele monitor is aangesloten
txt = Serial.read();
while (Serial.available());
if (txt == āxā){
PRINT(āend\nā);
ROODUIT
exit(1);
}
}
}