Project

General

Profile

Revision 797244ed

ID797244ed15fff6de7e6694d3d9b55dd460c05249
Parent 08af0896
Child 8ae3771a

Added by Aaron Perley over 10 years ago

Get bom i2c start interrupt working

View differences:

scout_avr/bom/tiny-twi.c
3 3
#include <util/delay.h>
4 4
#include "tiny-twi.h"
5 5

  
6
#define SDA PB0
7
#define SCL PB2
8

  
6 9
#define RECV_BUF_SIZE 2
7 10

  
8 11
uint8_t address;
......
23 26
slave_rx_t onDataRecieved;
24 27

  
25 28
static void twi_set_ctr(char n) {
26
  USISR &= ~0x0F;
27
  USISR |= n;
28
}
29

  
30
static void twi_release_scl() {
31
  DDRB &= ~_BV(DDB2);
32
}
33

  
34
static void twi_sink_sda() {
35
  DDRB |= _BV(DDB0);
36
}
37

  
38
static void twi_release_sda() {
39
  DDRB &= ~_BV(DDB0);
29
  USISR = n;
40 30
}
41 31

  
42 32
static void twi_ready() {
33
  USISR = _BV(USISIF) | _BV(USIOIF) | _BV(USIPF) | _BV(USIDC);
34
  DDRB |= _BV(SCL);  //SCL output
35
  DDRB &= ~_BV(SDA); //SDA input
43 36

  
44 37
  // enable start condition interrupt
45 38
  USICR |= _BV(USISIE);
......
51 44
}
52 45

  
53 46
static void twi_start() {
47
  // enable counter overflow interrupt (fires after 8 bits)
48
  USICR |= _BV(USIOIE);
49

  
50
  USISR = _BV(USISIF);
54 51

  
55 52
  // zero counter
56 53
  twi_set_ctr(0);
57 54

  
58
  // enable counter overflow interrupt (fires after 8 bits)
59
  USICR |= _BV(USIOIE);
60

  
61 55
  state = ADDRESS;
62 56
  recv_idx = 0;
63 57
}
......
69 63

  
70 64
  // set SDA low
71 65
  USIDR = 0;
72
  twi_sink_sda();
66
  DDRB |= _BV(SDA);
73 67

  
74 68
  // set state
75 69
  state = is_read? SEND_READ_ACK : SEND_WRITE_ACK;
76 70
}
77 71

  
78 72
ISR(USI_START_vect) {
73
  PORTB |= _BV(PB4); // DEBUG: LED ON
79 74
  twi_start();
80 75
}
81 76

  
......
99 94
      break;
100 95

  
101 96
    case SEND_WRITE_ACK:
102
      twi_release_sda();
97
      DDRB &= ~_BV(SDA);
103 98
      state = RECV_DATA;
104 99
      break;
105 100

  
......
114 109
      break;
115 110

  
116 111
    case SEND_READ_ACK:
117
      twi_release_sda();
112
      DDRB &= ~_BV(SDA);
118 113
      // TODO write to USIDR
119 114
      state = SEND_DATA;
120 115
      break;
......
125 120
    case RECV_ACK:
126 121
      break;
127 122
  }
128
  twi_release_scl();
123
  USISR = _BV(USIOIF) | (USISR & 0xF);
129 124
}
130 125

  
131 126
void smb_init(slave_rx_t callback) {
132 127
  // TODO do we want USICS0 (3)?
133 128
  USICR = _BV(USIWM1) | _BV(USIWM0) | _BV(USICS1);
129
  PORTB |= _BV(SDA) | _BV(SCL);
134 130
  twi_ready();
135 131
  onDataRecieved = callback;
136 132
}
......
150 146

  
151 147

  
152 148
int main() {
149
  sei();
153 150
  smb_set_address(5);
154 151
  DDRB |= _BV(DDB4);
155 152
  smb_init(testCB);
156
}
153
  while(1);
154
}

Also available in: Unified diff