diff --git a/firmware/include/si5351.h b/firmware/include/si5351.h new file mode 100644 index 0000000..54edb89 --- /dev/null +++ b/firmware/include/si5351.h @@ -0,0 +1,20 @@ +#ifndef __SI5351_H__ +#define __SI5351_H__ __SI5351_H__ + +#include + +#include "twi.h" + +const uint8_t SI5351_ADDRESS = 96; + +static inline uint8_t si5351_write8(uint8_t reg, uint8_t value) { + uint8_t data[3] = {reg, value}; + return twi_write(SI5351_ADDRESS, data, 2); +} + +static inline uint8_t si5351_write16(uint8_t reg, uint16_t value) { + uint8_t data[3] = {reg, value & 0xFF, (value & 0xFF00) >> 8}; + return twi_write(SI5351_ADDRESS, data, 3); +} + +#endif diff --git a/firmware/main.c b/firmware/main.c index a05c051..8d480fc 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -2,16 +2,19 @@ #include #include "twi.h" +#include "si5351.h" int main(void) { twi_init(); - while(1) { - uint8_t data[] = {'T','E','S','T'}; - twi_write(96, data, 4); - _delay_ms(10); - } + // Disable outputs + si5351_write8(3, 0xFF); + + // Powerdown output drivers + si5351_write8(16, 0x80); + si5351_write8(17, 0x80); + si5351_write8(18, 0x80); while(1); } diff --git a/firmware/twi.c b/firmware/twi.c index ed4ca93..94b1e62 100644 --- a/firmware/twi.c +++ b/firmware/twi.c @@ -35,7 +35,7 @@ uint8_t twi_write(uint8_t address, uint8_t data[], uint8_t len) { return 1; } - TWDR = address | TW_WRITE; // We want to write to the slave + TWDR = (address << 1) | TW_WRITE; // We want to write to the slave TWCR = (1 << TWINT) | (1 << TWEN); // Trigger transmission, keep TWI enabled // Wait for TWI unit to finish