summaryrefslogtreecommitdiffstats
path: root/app/i2c.c
blob: 5e00f3d03ab894e5fd5dff1b67ccb3cd8422ddb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "project.h"


#ifndef SLIM

#define GPIO_SCL GPIOB
#define GPIO_SDA GPIOB
#define SCL 	GPIO13
#define SDA	GPIO14

#define I2C_BB_DELAY do { delay_us(1); } while (0)

int
i2c_bb (int scl, int sda)
{
  if (scl)
    gpio_set (GPIO_SCL, SCL);
  else
    gpio_clear (GPIO_SCL, SCL);
  if (sda)
    gpio_set (GPIO_SDA, SDA);
  else
    gpio_clear (GPIO_SDA, SDA);

  return ! !(gpio_get (GPIO_SDA, SDA) & SDA);

}


void
i2c_bb_start (void)
{
  i2c_bb (1, 1);
  I2C_BB_DELAY;
  i2c_bb (1, 0);
  I2C_BB_DELAY;
  i2c_bb (0, 0);
  I2C_BB_DELAY;
}


void
i2c_bb_stop (void)
{
  i2c_bb (0, 0);
  I2C_BB_DELAY;
  i2c_bb (1, 0);
  I2C_BB_DELAY;
  i2c_bb (1, 1);
  I2C_BB_DELAY;
}

int
i2c_bb_send_data (uint8_t v)
{
  int c;


  for (c = 0x80; c; c >>= 1)
    {
      i2c_bb (0, c & v);
      I2C_BB_DELAY;
      i2c_bb (1, c & v);
      I2C_BB_DELAY;
      i2c_bb (0, c & v);
      I2C_BB_DELAY;
    }

  i2c_bb (0, 1);
  I2C_BB_DELAY;
  i2c_bb (1, 1);
  I2C_BB_DELAY;
  c = i2c_bb (1, 1);
  i2c_bb (0, 1);

  return c;
}


int
i2c_bb_start_transaction (uint8_t a, int wnr)
{
  int ret;

  i2c_bb_start ();
  ret = i2c_bb_send_data (a << 1 | ! !(wnr));


  return ret;
}

#if 0
void
i2c_bb_scan (void)
{
  int i, r;

  return;
  i2cp_reset ();

  printf ("Probing bus\r\n");
  for (i = 0; i < 128; ++i)
    {
      while (i2cp_lock ());
      i2cp_start ();
      i2cp_abort_start ();
      i2cp_stop ();
      i2cp_abort_stop ();
      r = i2cp_start_transaction (i, I2C_WRITE);
      i2cp_stop ();
      i2cp_unlock ();
      if (!r)
        printf ("Found device at address 0x%x\r\n", i);
      usart1_drain ();
    }
  printf ("Done\r\n");
  i2cp_reset ();

}
#endif

void
i2c_bb_init (void)
{
  gpio_set_mode (GPIO_SCL, GPIO_MODE_OUTPUT_50_MHZ,
                 GPIO_CNF_OUTPUT_OPENDRAIN, SCL);
  gpio_set_mode (GPIO_SDA, GPIO_MODE_OUTPUT_50_MHZ,
                 GPIO_CNF_OUTPUT_OPENDRAIN, SDA);

  i2c_bb_start ();
  i2c_bb_stop ();


}
#endif