Skip to content
Snippets Groups Projects
Commit 5935aeec authored by Neil Gershenfeld's avatar Neil Gershenfeld
Browse files

wip

parent 9a7ecd5b
No related branches found
No related merge requests found
...@@ -38,8 +38,7 @@ ...@@ -38,8 +38,7 @@
<a href=mag/hello.mag.USB.ino>hello.mag.USB.ino</a> <a href=mag/hello.mag.D11C.ino>hello.mag.D11C.ino</a> <a href=mag/hello.mag.USB.ino>hello.mag.USB.ino</a> <a href=mag/hello.mag.D11C.ino>hello.mag.D11C.ino</a>
<a href=https://www.digikey.com/en/products/detail/infineon-technologies/TLE493DA2B6HTSA1/9808570>vector</a> <a href=https://www.infineon.com/dgdl/Infineon-3D_Magnetic_Sensors-ProductBrief-v05_00-EN.pdf?fileId=5546d46261d5e6820161e7571b2b3dd0>applications</a> <a href=https://design.infineon.com/3dsim/>simulation</a> <a href=https://www.digikey.com/en/products/detail/infineon-technologies/TLE493DA2B6HTSA1/9808570>vector</a> <a href=https://www.infineon.com/dgdl/Infineon-3D_Magnetic_Sensors-ProductBrief-v05_00-EN.pdf?fileId=5546d46261d5e6820161e7571b2b3dd0>applications</a> <a href=https://design.infineon.com/3dsim/>simulation</a>
<a href=mag/TLE493D/hello.TLE493D.t412>hello.TLE493D.t412</a> <a href=mag/TLE493D/hello.TLE493D.t412.png>board</a> <a href=mag/TLE493D/hello.TLE493D.t412.jpg>components</a> <a href=mag/TLE493D/hello.TLE493D.t412.traces.png>traces</a> <a href=mag/TLE493D/hello.TLE493D.t412.traces_exterior.png>traces+exterior</a> <a href=mag/TLE493D/hello.TLE493D.t412.interior.png>interior</a> <a href=mag/TLE493D/hello.TLE493D.t412>hello.TLE493D.t412</a> <a href=mag/TLE493D/hello.TLE493D.t412.png>board</a> <a href=mag/TLE493D/hello.TLE493D.t412.jpg>components</a> <a href=mag/TLE493D/hello.TLE493D.t412.traces.png>traces</a> <a href=mag/TLE493D/hello.TLE493D.t412.traces_exterior.png>traces+exterior</a> <a href=mag/TLE493D/hello.TLE493D.t412.interior.png>interior</a>
<a href=mag/TLE493D/hello.TLE493D.t412.ino>hello.TLE493D.t412.ino</a> <a href=mag/TLE493D/hello.TLE493D.t412.c>.c</a> <a href=mag/TLE493D/hello.TLE493D.t412.make>.make</a> <a href=mag/TLE493D/hello.TLE493D.t412.py>.py</a> <a href=mag/TLE493D/hello.TLE493D.t412.mp4>video</a> <a href=mag/TLE493D/hello.TLE493D.t412.wire.ino>hello.TLE493D.t412.wire.ino</a> <a href=mag/TLE493D/hello.TLE493D.t412.softwire.ino>softwire.ino</a> <a href=mag/TLE493D/hello.TLE493D.t412.nowire.ino>nowire.ino</a> <a href=mag/TLE493D/hello.TLE493D.t412.c>.c</a> <a href=mag/TLE493D/hello.TLE493D.t412.make>.make</a> <a href=mag/TLE493D/hello.TLE493D.t412.py>.py</a> <a href=mag/TLE493D/hello.TLE493D.t412.mp4>video</a>
<b><a href=https://www.digikey.com/en/products/detail/nidec-copal-electronics/ST4ETB103/738213>potentiometer</a></b> <b><a href=https://www.digikey.com/en/products/detail/nidec-copal-electronics/ST4ETB103/738213>potentiometer</a></b>
<a href=http://academy.cba.mit.edu/classes/output_devices/DRV8428/hello.DRV8428-D11C-NEMA17.jpg>hello.DRV8428-D11C-NEMA17</a> <a href=http://academy.cba.mit.edu/classes/output_devices/DRV8428/hello.DRV8428-D11C-NEMA17.jpg>hello.DRV8428-D11C-NEMA17</a>
......
//
// hello.TLE493D.t412.nowire.ino
// TLE493D vector magnetometer tiny412 hello-world
// no I2C library version
//
// Neil Gershenfeld 3/29/25
//
// This work may be reproduced, modified, distributed,
// performed, and displayed for any purpose, but must
// acknowledge this project. Copyright is retained and
// must be preserved. The work is provided as is; no
// warranty is provided, and users accept all liability.
//
#define address 0x35
#define SDA PIN_PA1
#define SCL PIN_PA2
#define I2C_delay() delayMicroseconds(5)
unsigned char ret,data[10];
void SCL_write(unsigned char bit, unsigned char SCL_pin) {
//
// write SCL bit
//
if (bit == 0) {
pinMode(SCL_pin,OUTPUT);
digitalWrite(SCL_pin,LOW);
}
else {
pinMode(SCL_pin,INPUT);
while (digitalRead(SCL_pin) == LOW); // check for clock stretching
}
}
void SDA_write(unsigned char bit, unsigned char SDA_pin) {
//
// write SDA bit
//
if (bit == 0) {
pinMode(SDA_pin,OUTPUT);
digitalWrite(SDA_pin,LOW);
}
else
pinMode(SDA_pin,INPUT);
}
void I2C_init(unsigned char SCL_pin, unsigned char SDA_pin) {
//
// initialize I2C lines
//
SDA_write(1,SDA_pin);
SCL_write(1,SCL_pin);
}
unsigned char I2C_master_write_byte(unsigned char byte,
unsigned char SCL_pin, unsigned char SDA_pin) {
//
// master write I2C byte
//
unsigned char bit;
unsigned char ret = 0;
//
// loop over bits
//
for (bit = 0; bit < 8; ++bit) {
if ((byte & 0x80) == 0)
SDA_write(0,SDA);
else
SDA_write(1,SDA);
I2C_delay();
SCL_write(1,SCL);
I2C_delay();
SCL_write(0,SCL);
byte <<= 1;
}
//
// check for ACK
//
I2C_delay();
SDA_write(1,SDA);
SCL_write(1,SCL);
I2C_delay();
if (digitalRead(SDA) != LOW) {
//
// no ACK, return 1
//
ret = 1;
}
//
// yes ACK, return 0
//
SCL_write(0,SCL);
I2C_delay();
return ret;
}
unsigned char I2C_master_write(unsigned char* data, unsigned char nbytes, unsigned char secondary_address,
unsigned char SCL_pin, unsigned char SDA_pin) {
//
// I2C master write
//
unsigned char index,secondary_address_write;
unsigned char ret = 0;
//
// send start
//
SDA_write(0,SDA);
I2C_delay();
SCL_write(0,SCL);
//
// send secondary address
//
secondary_address_write = secondary_address << 1;
if (I2C_master_write_byte(secondary_address_write, SCL_pin, SDA_pin) != 0)
//
// no ACK, return 1
//
ret = 1;
//
// loop over bytes
//
for (index = 0; index < nbytes; ++index) {
ret = I2C_master_write_byte(data[index], SCL_pin, SDA_pin);
if (ret != 0)
//
// no ACK, return 1
//
ret = 1;
//
// yes ACK, continue
//
}
//
// send stop
//
SDA_write(0,SDA);
I2C_delay();
SCL_write(1,SCL);
I2C_delay();
SDA_write(1,SDA);
I2C_delay();
return ret;
}
void I2C_master_read_byte(unsigned char* data, unsigned char index, unsigned char nbytes,
unsigned char SCL_pin, unsigned char SDA_pin) {
//
// master read I2C byte
//
unsigned char byte,bit;
SDA_write(1,SDA);
byte = 0;
//
// loop over bits
//
for (bit = 0; bit < 8; ++bit) {
I2C_delay();
SCL_write(1,SCL);
I2C_delay();
if (digitalRead(SDA) != LOW)
byte |= (1 << (7-bit));
SCL_write(0,SCL);
}
data[index] = byte;
if (index < (nbytes-1)) {
//
// not done, send ACK
//
SDA_write(0,SDA);
I2C_delay();
SCL_write(1,SCL);
I2C_delay();
SCL_write(0,SCL);
SDA_write(1,SDA);
}
else {
//
// done, send NACK
//
SDA_write(1,SDA);
I2C_delay();
SCL_write(1,SCL);
I2C_delay();
SCL_write(0,SCL);
I2C_delay();
}
}
unsigned char I2C_master_read(unsigned char* data, unsigned char nbytes, unsigned char secondary_address,
unsigned char SCL_pin, unsigned char SDA_pin) {
//
// I2C master read
//
unsigned char index,secondary_address_read;
unsigned char ret = 0;
//
// send start
//
SDA_write(0,SDA);
I2C_delay();
SCL_write(0,SCL);
I2C_delay();
//
// send secondary address
//
secondary_address_read = (secondary_address << 1) + 1;
if (I2C_master_write_byte(secondary_address_read, SCL_pin, SDA_pin) == 1)
//
// no ACK, return 1
//
ret = 1;
//
// loop over bytes
//
for (index = 0; index < nbytes; ++index)
I2C_master_read_byte(data, index, nbytes, SCL_pin, SDA_pin);
//
// send stop
//
SCL_write(1,SCL);
I2C_delay();
SDA_write(1,SDA);
I2C_delay();
return ret;
}
void setup() {
//
// start serial and I2C
//
Serial.begin(115200);
I2C_init(SCL,SDA);
//
// reset TLE493D
//
data[0] = 0xFF;
ret = I2C_master_write(data,1,address,SCL,SDA);
data[0] = 0xFF;
ret = I2C_master_write(data,1,address,SCL,SDA);
data[0] = 0x00;
ret = I2C_master_write(data,1,address,SCL,SDA);
data[0] = 0x00;
ret = I2C_master_write(data,1,address,SCL,SDA);
//
// configure TLE493D
//
data[0] = 0x10;
data[1] = 0x28;
// config register 0x10
// ADC trigger on read after register 0x05
// short-range sensitivity
data[2] = 0x15;
// mode register 0x11
// 1-byte read protocol
// interrupt disabled
// master controlled mode
ret = I2C_master_write(data,3,address,SCL,SDA);
}
void loop() {
//
// read registers 0x00-0x05
//
ret = I2C_master_write(data,0,address,SCL,SDA);
ret = I2C_master_read(data,6,address,SCL,SDA);
//
// send framing
//
Serial.write(1);
Serial.write(2);
Serial.write(3);
Serial.write(4);
//
// send data
//
Serial.write(data,6);
}
//
// hello.TLE493D.t412.softwire.ino
// TLE493D vector magnetometer tiny412 hello-world
// SoftWire I2C library version
//
// Neil Gershenfeld 3/29/25
//
// This work may be reproduced, modified, distributed,
// performed, and displayed for any purpose, but must
// acknowledge this project. Copyright is retained and
// must be preserved. The work is provided as is; no
// warranty is provided, and users accept all liability.
//
#include <SoftWire.h>
#define address 0x35
#define SDA PIN_PA1
#define SCL PIN_PA2
char Tx[16];
char Rx[16];
SoftWire SWire(SDA,SCL);
void setup() {
//
// start serial and I2C
//
Serial.begin(115200);
SWire.setTxBuffer(Tx,sizeof(Tx));
SWire.setRxBuffer(Rx,sizeof(Rx));
SWire.setDelay_us(5);
SWire.setTimeout(1000);
SWire.begin();
//
// reset TLE493D
//
SWire.beginTransmission(0);
SWire.write(0xFF);
SWire.endTransmission();
SWire.beginTransmission(0);
SWire.write(0xFF);
SWire.endTransmission();
SWire.beginTransmission(0);
SWire.write(0x00);
SWire.endTransmission();
SWire.beginTransmission(0);
SWire.write(0x00);
SWire.endTransmission();
delayMicroseconds(50);
//
// configure TLE493D
//
SWire.beginTransmission(address);
SWire.write(0x10);
SWire.write(0x28);
// config register 0x10
// ADC trigger on read after register 0x05
// short-range sensitivity
SWire.write(0x15);
// mode register 0x11
// 1-byte read protocol
// interrupt disabled
// master controlled mode
SWire.endTransmission();
}
void loop() {
uint8_t v0,v1,v2,v3,v4,v5;
//
// read data
//
SWire.requestFrom(address,6);
v0 = SWire.read();
v1 = SWire.read();
v2 = SWire.read();
v3 = SWire.read();
v4 = SWire.read();
v5 = SWire.read();
//
// send framing
//
Serial.write(1);
Serial.write(2);
Serial.write(3);
Serial.write(4);
//
// send data
//
Serial.write(v0);
Serial.write(v1);
Serial.write(v2);
Serial.write(v3);
Serial.write(v4);
Serial.write(v5);
}
//
// hello.TLE493D.t412.wire.ino
// TLE493D vector magnetometer tiny412 hello-world
// Wire I2C library version
//
// Neil Gershenfeld 3/29/25
//
// This work may be reproduced, modified, distributed,
// performed, and displayed for any purpose, but must
// acknowledge this project. Copyright is retained and
// must be preserved. The work is provided as is; no
// warranty is provided, and users accept all liability.
//
#include <Wire.h>
#define address 0x35
void setup() {
//
// start serial and I2C
//
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000);
//
// reset TLE493D
//
Wire.beginTransmission(0);
Wire.write(0xFF);
Wire.endTransmission();
Wire.beginTransmission(0);
Wire.write(0xFF);
Wire.endTransmission();
Wire.beginTransmission(0);
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(0);
Wire.write(0x00);
Wire.endTransmission();
delayMicroseconds(50);
//
// configure TLE493D
//
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.write(0x28);
// config register 0x10
// ADC trigger on read after register 0x05
// short-range sensitivity
Wire.write(0x15);
// mode register 0x11
// 1-byte read protocol
// interrupt disabled
// master controlled mode
Wire.endTransmission();
}
void loop() {
uint8_t v0,v1,v2,v3,v4,v5;
//
// read data
//
Wire.requestFrom(address,6);
v0 = Wire.read();
v1 = Wire.read();
v2 = Wire.read();
v3 = Wire.read();
v4 = Wire.read();
v5 = Wire.read();
//
// send framing
//
Serial.write(1);
Serial.write(2);
Serial.write(3);
Serial.write(4);
//
// send data
//
Serial.write(v0);
Serial.write(v1);
Serial.write(v2);
Serial.write(v3);
Serial.write(v4);
Serial.write(v5);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment