1 | #include <avr/io.h>
|
2 |
|
3 | #include "i2ceeprom.h"
|
4 | #include "main.h"
|
5 | #include "twi_master_driver.h"
|
6 | #include "rs232.h"
|
7 |
|
8 | #define TWI_PWRSAVEREG PR_PRPE
|
9 | #define TWI_PWRSAVEBIT PR_TWI_bm
|
10 | #define TWI TWIE
|
11 | #define TWI_IO PORTE
|
12 | #define TWI_DATA_PIN PIN1CTRL
|
13 | #define TWI_CLK_PIN PIN0CTRL
|
14 |
|
15 | //eeprom allows maximum 100kHz at 1.7V
|
16 | #define TWI_BAUDRATE 80000
|
17 | #define TWI_BAUDSETTING TWI_BAUD(F_CPU, TWI_BAUDRATE)
|
18 | //fixed 1010 + A2 = VCC, A1, A0 = GND -> 1010100 -> 0x54
|
19 | #define TWI_SLAVE_ADDRESS 0x54
|
20 |
|
21 | TWI_Master_t g_twiMaster;
|
22 |
|
23 | uint8_t i2ceep_init(void) {
|
24 | TWI_PWRSAVEREG &= ~PR_TWI_bm;
|
25 | TWI_IO.TWI_DATA_PIN = PORT_OPC_PULLUP_gc;
|
26 | TWI_IO.TWI_CLK_PIN = PORT_OPC_PULLUP_gc;
|
27 | TWI_MasterInit(&g_twiMaster, &TWI, TWI_MASTER_INTLVL_LO_gc, TWI_BAUDSETTING);
|
28 | PMIC.CTRL |= PMIC_LOLVLEN_bm;
|
29 |
|
30 | while (TWI_MasterReady(&g_twiMaster) != TWIM_STATUS_READY);
|
31 | uint8_t buffer[3];
|
32 | buffer[0] = 0x0;
|
33 | buffer[1] = 0x0;
|
34 | buffer[2] = 0x0F;
|
35 | TWI_MasterWrite(&g_twiMaster, TWI_SLAVE_ADDRESS, buffer, 3);
|
36 | while (TWI_MasterReady(&g_twiMaster) != TWIM_STATUS_READY);
|
37 | buffer[2] = 0;
|
38 |
|
39 |
|
40 | TWI_MasterWriteRead(&g_twiMaster, TWI_SLAVE_ADDRESS, buffer, 2, 1);
|
41 | while (TWI_MasterReady(&g_twiMaster) != TWIM_STATUS_READY);
|
42 | if (g_twiMaster.readData[0] == 0x0F) {
|
43 | return 0;
|
44 | }
|
45 | return 1;
|
46 | }
|
47 |
|
48 | uint8_t i2ceep_writebyte(uint16_t address, uint8_t value) {
|
49 | uint8_t buffer[3];
|
50 | buffer[0] = address>>8;
|
51 | buffer[1] = (uint8_t)address;
|
52 | buffer[2] = value;
|
53 | while (TWI_MasterReady(&g_twiMaster) != TWIM_STATUS_READY);
|
54 | TWI_MasterWrite(&g_twiMaster, TWI_SLAVE_ADDRESS, buffer, 3);
|
55 | return 0;
|
56 | }
|
57 |
|
58 | uint8_t i2ceep_readbyte(uint16_t address) {
|
59 | uint8_t buffer[3];
|
60 | buffer[0] = address>>8;
|
61 | buffer[1] = (uint8_t)address;
|
62 | while (TWI_MasterReady(&g_twiMaster) != TWIM_STATUS_READY);
|
63 | TWI_MasterWriteRead(&g_twiMaster, TWI_SLAVE_ADDRESS, buffer, 2, 1);
|
64 | while (TWI_MasterReady(&g_twiMaster) != TWIM_STATUS_READY);
|
65 | rs232_puthex(g_twiMaster.readData[0]); //debug only
|
66 | return g_twiMaster.readData[0];
|
67 | }
|
68 |
|
69 | void i2ceep_test(uint8_t data) {
|
70 | //while (TWI_MasterReady(&g_twiMaster) != TWIM_STATUS_READY);
|
71 | TWI_MasterWrite(&g_twiMaster, TWI_SLAVE_ADDRESS, &data, 1);
|
72 | }
|
73 |
|
74 | void i2ceep_disable(void) {
|
75 | TWI_PWRSAVEREG |= PR_TWI_bm;
|
76 | }
|
77 |
|
78 | ISR(TWIE_TWIM_vect) {
|
79 | TWI_MasterInterruptHandler(&g_twiMaster);
|
80 | }
|