Changeset 584 for trunk/electronics
- Timestamp:
- 10/25/09 12:37:47 (2 years ago)
- Location:
- trunk/electronics/avr/can-bridge
- Files:
-
- 5 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/electronics/avr/can-bridge/main.c
r571 r584 155 155 }; 156 156 157 #define kCSLow 0 158 #define kCSHigh 1 159 160 void spi_mcp_cs(uint8_t state) 161 { 162 switch (state) { 163 case kCSLow: 164 PORTB &= ~(1 << PB0); 165 break; 166 case kCSHigh: 167 PORTB |= (1 << PB0); 168 break; 169 } 170 } 171 157 172 int main(void) 158 173 { 174 spi_context_t spi_ctxt; 159 175 EICRA = 0; 160 176 EIMSK |= 1; … … 164 180 165 181 usart_init(19200); 182 166 183 spi_init(); 167 mcp_init(handlers); 184 spi_ctxt.send = spi_send; 185 spi_ctxt.recv = spi_recv; 186 spi_ctxt.set_cs = spi_mcp_cs; 187 188 189 mcp_init(handlers, &spi_ctxt); 168 190 169 191 sei(); -
trunk/electronics/avr/can-bridge/mcp.c
r571 r584 5 5 #include <stdint.h> 6 6 #include "usart.h" 7 #include "spi.h"8 7 #include "mcp.h" 9 8 … … 18 17 19 18 static can_handler_t *handler_list = NULL; 19 static spi_context_t *spi_ctxt = NULL; 20 20 21 21 int can_handler(canmsg_t *msg, can_handler_t handler_list[]) … … 42 42 } 43 43 44 45 static void _setcs(uint8_t state) 46 { 47 switch (state) { 48 case kCSLow: 49 spi_cslow(CS); 50 break; 51 case kCSHigh: 52 spi_cshigh(CS); 53 break; 54 } 55 56 } 44 //static void spi_ctxt->set_cs(uint8_t state) 45 //{ 46 // switch (state) { 47 // case kCSLow: 48 // spi_cslow(CS); 49 // break; 50 // case kCSHigh: 51 // spi_cshigh(CS); 52 // break; 53 // } 54 //} 57 55 58 56 void mcp_set_mode(uint8_t mode) … … 91 89 } 92 90 93 void mcp_init(can_handler_t handlers[]) 94 { 91 void mcp_init(const can_handler_t handlers[], spi_context_t *spi_context) 92 { 93 94 handler_list = (can_handler_t *)handlers; 95 spi_ctxt = spi_context; 96 95 97 mcp_reset(); 96 handler_list = handlers;97 98 98 99 mcp_set_mode(kModeConfig); … … 110 111 void mcp_reset(void) 111 112 { 112 _setcs(kCSLow);113 spi_ send(kCmdReset);114 _setcs(kCSHigh);113 spi_ctxt->set_cs(kCSLow); 114 spi_ctxt->send(kCmdReset); 115 spi_ctxt->set_cs(kCSHigh); 115 116 _delay_ms(10); 116 117 } … … 119 120 { 120 121 121 _setcs(kCSLow);122 spi_ send(kCmdWrite);123 spi_ send(addr);124 spi_ send(data);125 _setcs(kCSHigh);122 spi_ctxt->set_cs(kCSLow); 123 spi_ctxt->send(kCmdWrite); 124 spi_ctxt->send(addr); 125 spi_ctxt->send(data); 126 spi_ctxt->set_cs(kCSHigh); 126 127 } 127 128 … … 130 131 uint8_t i; 131 132 132 _setcs(kCSLow);133 spi_ send(kCmdRead);134 spi_ send(addr);133 spi_ctxt->set_cs(kCSLow); 134 spi_ctxt->send(kCmdRead); 135 spi_ctxt->send(addr); 135 136 136 137 for (i = 0; i < len; i++) 137 buf[i] = spi_ recv();138 139 _setcs(kCSHigh);138 buf[i] = spi_ctxt->recv(); 139 140 spi_ctxt->set_cs(kCSHigh); 140 141 } 141 142 … … 144 145 uint8_t stat; 145 146 146 _setcs(kCSLow);147 spi_ send(kCmdReadStatus);148 stat = spi_ recv();149 _setcs(kCSHigh);147 spi_ctxt->set_cs(kCSLow); 148 spi_ctxt->send(kCmdReadStatus); 149 stat = spi_ctxt->recv(); 150 spi_ctxt->set_cs(kCSHigh); 150 151 151 152 return stat; … … 154 155 void mcp_bit_mod(uint8_t addr, uint8_t mask, uint8_t data) 155 156 { 156 _setcs(kCSLow);157 spi_ send(kCmdBitModify);158 spi_ send(addr);159 spi_ send(mask);160 spi_ send(data);161 _setcs(kCSHigh);157 spi_ctxt->set_cs(kCSLow); 158 spi_ctxt->send(kCmdBitModify); 159 spi_ctxt->send(addr); 160 spi_ctxt->send(mask); 161 spi_ctxt->send(data); 162 spi_ctxt->set_cs(kCSHigh); 162 163 } 163 164 … … 166 167 uint8_t i; 167 168 uint8_t tmp; 168 _setcs(kCSLow);169 spi_ctxt->set_cs(kCSLow); 169 170 CANMSG_ZERO(msg); 170 spi_ send(kCmdReadRXBuffer | rxbuf);171 tmp = spi_ recv(); //RXBnSIDH171 spi_ctxt->send(kCmdReadRXBuffer | rxbuf); 172 tmp = spi_ctxt->recv(); //RXBnSIDH 172 173 msg->addr[0] = tmp >> 3; 173 174 msg->addr[1] = ((tmp & 0x07) << 5); 174 tmp = spi_ recv(); // RXBnSIDL175 tmp = spi_ctxt->recv(); // RXBnSIDL 175 176 if (tmp & mRXBSIDL_IDE) 176 177 CANMSG_SET_FLAG(msg, mCANMSG_EX); … … 178 179 CANMSG_SET_FLAG(msg, mCANMSG_RTR); 179 180 msg->addr[1] |= ((tmp & 0xE0) >> 3) | (tmp & 0x03); 180 msg->addr[2] = spi_ recv(); // RXBnEID8181 msg->addr[3] = spi_ recv(); // RXBnEID0182 183 tmp = spi_ recv(); //DLC181 msg->addr[2] = spi_ctxt->recv(); // RXBnEID8 182 msg->addr[3] = spi_ctxt->recv(); // RXBnEID0 183 184 tmp = spi_ctxt->recv(); //DLC 184 185 msg->dlc = tmp & 0x0F; 185 186 if (CANMSG_TST_FLAG(msg, mCANMSG_EX) && (tmp & mRXBDLC_RTR)) … … 189 190 if (!CANMSG_TST_FLAG(msg, mCANMSG_RTR)) { 190 191 for (i = 0; i < msg->dlc; i++) 191 msg->data[i] = spi_ recv();192 } 193 194 _setcs(kCSHigh);192 msg->data[i] = spi_ctxt->recv(); 193 } 194 195 spi_ctxt->set_cs(kCSHigh); 195 196 } 196 197 … … 224 225 uint8_t i; 225 226 226 _setcs(kCSLow);227 spi_ send(kCmdLoadTXBuffer | txbuf);228 229 spi_ send((msg->addr[0] << 3) | (msg->addr[1] >> 5));230 spi_ send( ((msg->addr[1] & 0x1C) << 3) | (msg->addr[1] & 0x03)227 spi_ctxt->set_cs(kCSLow); 228 spi_ctxt->send(kCmdLoadTXBuffer | txbuf); 229 230 spi_ctxt->send((msg->addr[0] << 3) | (msg->addr[1] >> 5)); 231 spi_ctxt->send( ((msg->addr[1] & 0x1C) << 3) | (msg->addr[1] & 0x03) 231 232 | ((msg->flags & mCANMSG_EX) ? 0x08 : 0x00)); 232 spi_ send(msg->addr[2]);233 spi_ send(msg->addr[3]);234 235 spi_ send(msg->dlc | (CANMSG_TST_FLAG(msg, mCANMSG_RTR) ? mTXBDLC_RTR : 0));233 spi_ctxt->send(msg->addr[2]); 234 spi_ctxt->send(msg->addr[3]); 235 236 spi_ctxt->send(msg->dlc | (CANMSG_TST_FLAG(msg, mCANMSG_RTR) ? mTXBDLC_RTR : 0)); 236 237 237 238 if (!CANMSG_TST_FLAG(msg, mCANMSG_RTR)) { 238 239 for (i = 0; i < msg->dlc; i++) 239 spi_ send(msg->data[i]);240 } 241 242 _setcs(kCSHigh);240 spi_ctxt->send(msg->data[i]); 241 } 242 243 spi_ctxt->set_cs(kCSHigh); 243 244 244 245 } … … 274 275 } 275 276 276 _setcs(kCSLow);277 spi_ send(kCmdRTS | rts);278 _setcs(kCSHigh);277 spi_ctxt->set_cs(kCSLow); 278 spi_ctxt->send(kCmdRTS | rts); 279 spi_ctxt->set_cs(kCSHigh); 279 280 } 280 281 -
trunk/electronics/avr/can-bridge/mcp.h
r571 r584 1 2 1 3 2 … … 143 142 } 144 143 144 typedef struct { 145 uint8_t (*send)(uint8_t); 146 uint8_t (*recv)(void); 147 void (*set_cs)(uint8_t); 148 } spi_context_t; 145 149 146 147 148 void mcp_init(can_handler_t handlers[]); 150 void mcp_init(const can_handler_t handlers[], spi_context_t *); 149 151 void mcp_reset(void); 150 152 void mcp_read(uint8_t addr, uint8_t len, uint8_t *buf); … … 158 160 void mcp_bit_mod(uint8_t addr, uint8_t mask, uint8_t data); 159 161 162 163 164 -
trunk/electronics/avr/can-bridge/spi.c
r564 r584 12 12 } 13 13 14 int8_t spi_send(int8_t d)14 uint8_t spi_send(uint8_t d) 15 15 { 16 16 SPDR = d; 17 18 17 while (!(SPSR & (1 << SPIF))); 19 20 18 return SPDR; 21 19 } 22 20 21 uint8_t spi_recv(void) 22 { 23 return spi_send(0x0); 24 } 25 26 27 28 -
trunk/electronics/avr/can-bridge/spi.h
r564 r584 1 #define spi_recv() spi_send(0x0)2 3 1 #define SPIDDR DDRB 4 2 #define SPIPORT PORTB … … 10 8 11 9 void spi_init(); 12 int8_t spi_send(int8_t d); 10 uint8_t spi_send(uint8_t d); 11 uint8_t spi_recv(void); 13 12 14 13 15 #define spi_cslow(x) SPIPORT &= ~(1 << x);16 #define spi_cshigh(x) SPIPORT |= (1 << x);14 //#define spi_cslow(x) SPIPORT &= ~(1 << x); 15 //#define spi_cshigh(x) SPIPORT |= (1 << x);

