Rev 701 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 701 | Rev 726 | ||
---|---|---|---|
Line 13... | Line 13... | ||
13 | volatile uint8_t motor_rx[8]; |
13 | volatile uint8_t motor_rx[8]; |
Line 14... | Line 14... | ||
14 | 14 | ||
15 | /**************************************************/ |
15 | /**************************************************/ |
16 | /* Initialize I2C (TWI) */ |
16 | /* Initialize I2C (TWI) */ |
17 | /**************************************************/ |
17 | /**************************************************/ |
18 | void i2c_init(void) |
18 | void I2C_Init(void) |
19 | { |
19 | { |
20 | uint8_t sreg = SREG; |
20 | uint8_t sreg = SREG; |
Line 21... | Line 21... | ||
21 | cli(); |
21 | cli(); |
Line 38... | Line 38... | ||
38 | } |
38 | } |
Line 39... | Line 39... | ||
39 | 39 | ||
40 | /****************************************/ |
40 | /****************************************/ |
41 | /* Start I2C */ |
41 | /* Start I2C */ |
42 | /****************************************/ |
42 | /****************************************/ |
43 | void i2c_start(void) |
43 | void I2C_Start(void) |
44 | { |
44 | { |
45 | // TWI Control Register |
45 | // TWI Control Register |
46 | // clear TWI interrupt flag (TWINT=1) |
46 | // clear TWI interrupt flag (TWINT=1) |
47 | // disable TWI Acknowledge Bit (TWEA = 0) |
47 | // disable TWI Acknowledge Bit (TWEA = 0) |
Line 54... | Line 54... | ||
54 | } |
54 | } |
Line 55... | Line 55... | ||
55 | 55 | ||
56 | /****************************************/ |
56 | /****************************************/ |
57 | /* Stop I2C */ |
57 | /* Stop I2C */ |
58 | /****************************************/ |
58 | /****************************************/ |
59 | void i2c_stop(void) |
59 | void I2C_Stop(void) |
60 | { |
60 | { |
61 | // TWI Control Register |
61 | // TWI Control Register |
62 | // clear TWI interrupt flag (TWINT=1) |
62 | // clear TWI interrupt flag (TWINT=1) |
63 | // disable TWI Acknowledge Bit (TWEA = 0) |
63 | // disable TWI Acknowledge Bit (TWEA = 0) |
Line 70... | Line 70... | ||
70 | } |
70 | } |
Line 71... | Line 71... | ||
71 | 71 | ||
72 | /****************************************/ |
72 | /****************************************/ |
73 | /* Reset I2C */ |
73 | /* Reset I2C */ |
74 | /****************************************/ |
74 | /****************************************/ |
75 | void i2c_reset(void) |
75 | void I2C_Reset(void) |
76 | { |
76 | { |
77 | // stop i2c bus |
77 | // stop i2c bus |
78 | i2c_stop(); |
78 | I2C_Stop(); |
79 | twi_state = 0; |
79 | twi_state = 0; |
80 | motor = TWDR; // ?? |
80 | motor = TWDR; // ?? |
81 | motor = 0; |
81 | motor = 0; |
82 | TWCR = (1<<TWINT); // reset to original state incl. interrupt flag reset |
82 | TWCR = (1<<TWINT); // reset to original state incl. interrupt flag reset |
83 | TWAMR = 0; |
83 | TWAMR = 0; |
84 | TWAR = 0; |
84 | TWAR = 0; |
85 | TWDR = 0; |
85 | TWDR = 0; |
86 | TWSR = 0; |
86 | TWSR = 0; |
87 | TWBR = 0; |
87 | TWBR = 0; |
88 | i2c_init(); |
88 | I2C_Init(); |
89 | i2c_start(); |
89 | I2C_Start(); |
90 | i2c_write_byte(0); |
90 | I2C_WriteByte(0); |
Line 91... | Line 91... | ||
91 | } |
91 | } |
92 | 92 | ||
93 | /****************************************/ |
93 | /****************************************/ |
94 | /* Write to I2C */ |
94 | /* Write to I2C */ |
95 | /****************************************/ |
95 | /****************************************/ |
96 | void i2c_write_byte(int8_t byte) |
96 | void I2C_WriteByte(int8_t byte) |
97 | { |
97 | { |
98 | // move byte to send into TWI Data Register |
98 | // move byte to send into TWI Data Register |
99 | TWDR = byte; |
99 | TWDR = byte; |
Line 105... | Line 105... | ||
105 | 105 | ||
106 | 106 | ||
107 | /****************************************/ |
107 | /****************************************/ |
108 | /* Receive byte and send ACK */ |
108 | /* Receive byte and send ACK */ |
109 | /****************************************/ |
109 | /****************************************/ |
110 | void i2c_receive_byte(void) |
110 | void I2C_ReceiveByte(void) |
111 | { |
111 | { |
Line 112... | Line 112... | ||
112 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
112 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
113 | } |
113 | } |
114 | 114 | ||
115 | /****************************************/ |
115 | /****************************************/ |
116 | /* I2C receive last byte and send no ACK*/ |
116 | /* I2C receive last byte and send no ACK*/ |
117 | /****************************************/ |
117 | /****************************************/ |
118 | void i2c_receive_last_byte(void) |
118 | void I2C_ReceiveLastByte(void) |
Line 131... | Line 131... | ||
131 | 131 | ||
132 | switch (twi_state++) // First i2s_start from SendMotorData() |
132 | switch (twi_state++) // First i2s_start from SendMotorData() |
133 | { |
133 | { |
134 | // Master Transmit |
134 | // Master Transmit |
135 | case 0: // Send SLA-W |
135 | case 0: // Send SLA-W |
136 | i2c_write_byte(0x52+(motor*2)); |
136 | I2C_WriteByte(0x52+(motor*2)); |
137 | break; |
137 | break; |
138 | case 1: // Send Data to Salve |
138 | case 1: // Send Data to Salve |
139 | switch(motor++) |
139 | switch(motor++) |
140 | { |
140 | { |
141 | case 0: |
141 | case 0: |
142 | i2c_write_byte(Motor_Front); |
142 | I2C_WriteByte(Motor_Front); |
143 | break; |
143 | break; |
144 | case 1: |
144 | case 1: |
145 | i2c_write_byte(Motor_Rear); |
145 | I2C_WriteByte(Motor_Rear); |
146 | break; |
146 | break; |
147 | case 2: |
147 | case 2: |
148 | i2c_write_byte(Motor_Right); |
148 | I2C_WriteByte(Motor_Right); |
149 | break; |
149 | break; |
150 | case 3: |
150 | case 3: |
151 | i2c_write_byte(Motor_Left); |
151 | I2C_WriteByte(Motor_Left); |
152 | break; |
152 | break; |
153 | } |
153 | } |
154 | break; |
154 | break; |
155 | case 2: // repeat case 0+1 for all Slaves |
155 | case 2: // repeat case 0+1 for all Slaves |
156 | if (motor<4) twi_state = 0; |
156 | if (motor<4) twi_state = 0; |
157 | i2c_start(); // Repeated start -> switch salve or switch Master Transmit -> Master Receive |
157 | I2C_Start(); // Repeated start -> switch salve or switch Master Transmit -> Master Receive |
Line 158... | Line 158... | ||
158 | break; |
158 | break; |
159 | 159 | ||
160 | // Master Receive |
160 | // Master Receive |
161 | case 3: // Send SLA-R |
161 | case 3: // Send SLA-R |
162 | i2c_write_byte(0x53+(motorread*2)); |
162 | I2C_WriteByte(0x53+(motorread*2)); |
163 | break; |
163 | break; |
164 | case 4: |
164 | case 4: |
165 | //Transmit 1st byte |
165 | //Transmit 1st byte |
166 | i2c_receive_byte(); |
166 | I2C_ReceiveByte(); |
167 | break; |
167 | break; |
168 | case 5: //Read 1st byte and transmit 2nd Byte |
168 | case 5: //Read 1st byte and transmit 2nd Byte |
169 | motor_rx[motorread] = TWDR; |
169 | motor_rx[motorread] = TWDR; |
170 | i2c_receive_last_byte(); |
170 | I2C_ReceiveLastByte(); |
171 | break; |
171 | break; |
172 | case 6: |
172 | case 6: |
173 | //Read 2nd byte |
173 | //Read 2nd byte |
174 | motor_rx[motorread+4] = TWDR; |
174 | motor_rx[motorread+4] = TWDR; |
Line 175... | Line 175... | ||
175 | motorread++; |
175 | motorread++; |
176 | if (motorread > 3) motorread=0; |
176 | if (motorread > 3) motorread=0; |
177 | 177 | ||
178 | default: |
178 | default: |
179 | i2c_stop(); |
179 | I2C_Stop(); |
180 | twi_state = 0; |
180 | twi_state = 0; |
181 | I2CTimeout = 10; |
181 | I2CTimeout = 10; |