Project

General

Profile

Revision fa11365c

IDfa11365c9b19d5fac57fdb0f6442f1060dcf1ac1
Parent 6b1a3a0d
Child 3a25bcb9

Added by Aaron Perley about 10 years ago

Arbitrary length i2c test

View differences:

scout_avr/bom/bootloader.h
1 1
#ifndef BOOTLOADER_H
2 2
#define BOOTLOADER_H
3 3

  
4
void boot_program_page (uint32_t page, uint8_t *buf)
4
void boot_program_page (uint32_t page, uint8_t *buf);
5 5

  
6 6
#endif
scout_avr/bom/test.c
6 6

  
7 7

  
8 8
static void slave_rx(uint8_t *buf, int len) {
9
  if (len >= 3) {
9
  if (len > 1) {
10 10
    switch (buf[0]) {
11 11
      case BOM_I2C_SEND:
12 12
        smb_send_data(buf, len);
scout_avr/bom/tiny-twi-sync.c
6 6
#define SDA PB0
7 7
#define SCL PB2
8 8

  
9
#define RECV_BUF_SIZE 3
9
#define RECV_BUF_SIZE 100
10 10
#define SEND_BUF_SIZE 100
11 11

  
12 12
uint8_t address;
......
106 106
      break;
107 107

  
108 108
    case SEND_WRITE_ACK:
109
      if (recv_idx == RECV_BUF_SIZE) {
110
        onDataRecieved(recv_data, RECV_BUF_SIZE);
111
        twi_ready();
112
      } else {
113
        DDRB &= ~_BV(SDA);
114
        state = RECV_DATA;
115
      }
109
      DDRB &= ~_BV(SDA);
110
      state = RECV_DATA;
116 111
      break;
117 112

  
118 113
    case RECV_DATA:
119 114
      twi_send_ack(0);
120
      recv_data[recv_idx] = input;
121
      recv_idx++;
115
      if (recv_idx < RECV_BUF_SIZE) {
116
        recv_data[recv_idx] = input;
117
        recv_idx++;
118
      }
122 119
      break;
123 120

  
124 121
    case SEND_READ_ACK:
......
141 138
  }
142 139
}
143 140

  
141
static void twi_on_stop(void) {
142
  onDataRecieved(recv_data, recv_idx);
143
  twi_ready();
144
}
145

  
144 146
void smb_init(slave_rx_t callback) {
145 147
  // TODO do we want USICS0 (3)?
146 148
  USICR = _BV(USIWM1) | _BV(USIWM0) | _BV(USICS1);
......
173 175
    twi_on_overflow();
174 176
    USISR |= _BV(USIOIF);
175 177
  }
178
  if (USISR & _BV(USIPF)) {
179
    twi_on_stop();
180
    USISR |= _BV(USIPF);
181
  }
176 182
}

Also available in: Unified diff