Я сделал проект, основанный на микроконтроллере ATSAMG55J19, запрограммированном с Atmel Studio и ASF 3
Теперь я пытаюсь добавить внешние часы RT C, потому что внутренний SAMg55 RT c делает не иметь резервного аккумулятора. Модуль будет использоваться для считывания текущего времени после сбоя питания, затем я буду использовать внутреннюю RT C, поэтому мне нужна только базовая c связь. Нет необходимости записывать определенные c данные в EEPROM или устанавливать аварийные сигналы.
У меня есть MCP79411, подключенный через i2 c, но нет какой-либо библиотеки, подходящей для этого MCU, которая использует библиотеку ASF TWI.
Существует множество реализаций Arduino, но они используют библиотеку Wire.h, и я не могу ее портировать.
Я попытался перенести этот простой «драйвер»: https://www.ccsinfo.com/forum/viewtopic.php?t=54105
Вот некоторый код
static void i2c_start(void){
static twi_options_t ext3_twi_options;
flexcom_enable(FLEXCOM4);
flexcom_set_opmode(FLEXCOM4, FLEXCOM_TWI);
ext3_twi_options.master_clk = sysclk_get_cpu_hz();
ext3_twi_options.speed = 100000;
ext3_twi_options.smbus = 0;
twi_master_init(TWI4, &ext3_twi_options);
}
// Init Real Time Clock
void rtc_Init(void)
{
uint8_t seconds = 0;
i2c_start();
twi_write_byte(TWI4, ADDR_RTCC_WRITE); // WR to RTC
twi_write_byte(TWI4, ADDR_SEC); // REG 0
twi_write_byte(TWI4, ADDR_RTCC_READ); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in rtc
//i2c_stop();
//seconds &= 0x7F;
seconds |= 0x80; //set to 1 bit 7 of seconds(ST) enabling oscillator
delay_us(3);
twi_write_byte(TWI4, ADDR_RTCC_WRITE); // WR to RTC
twi_write_byte(TWI4, ADDR_SEC); // REG 0
twi_write_byte(TWI4, bin2bcd(seconds) | 0x80); // Start oscillator with current "seconds value
twi_write_byte(TWI4, ADDR_RTCC_WRITE); // WR to RTC
twi_write_byte(TWI4, 0x07); // Control Register
twi_write_byte(TWI4, 0x80); // Disable squarewave output pin
//i2c_stop();
}
Затем я попробовал rtc_set_date_time (uint8_t день, uint8_t mth, uint8_t год, uint8_t dow, uint8_t hr, uint8_t min, uint8_t se c)
и
void rtc_get_time(uint8_t &hr, uint8_t &min, uint8_t &sec)
{
twi_write_byte(TWI4, ADDR_RTCC_WRITE);
twi_write_byte(TWI4, 0x00);
twi_write_byte(TWI4, ADDR_RTCC_READ);
sec = bcd2bin(twi_read_byte(TWI4) & 0x7f); //0x7f b01111111
min = bcd2bin(twi_read_byte(TWI4) & 0x7f); //0x7f
hr = bcd2bin(twi_read_byte(TWI4) & 0x3f); //0x3f b00111111
//i2c_stop();
}
Но я всегда получаю "0" байтов.
Я не могу понять, как правильно открыть связь и читать байты из i2 c.
Единственная ссылка, которую я нашел, это http://asf.atmel.com/docs/latest/sam.drivers.twi.twi_eeprom_example.samg53_xplained_pro/html/index.html, но, похоже, это совсем другой тип связи.
Как правильно отправлять и получать эти байты через i2 c?