Revision b3a09205
| b/firmware/fx2/include/usrp_commands.h | ||
|---|---|---|
| 54 | 54 |
// wIndexL: format |
| 55 | 55 |
// len: how much to read |
| 56 | 56 |
|
| 57 |
#define VRQ_SPI_TRANSACT 0x83 // wValueH: OUT byte 0 |
|
| 58 |
// wValueL: OUT byte 1 |
|
| 59 |
// wIndexH: OUT byte 2 |
|
| 60 |
// wIndexL: OUT byte 3 |
|
| 61 |
// wLengthH: enables |
|
| 62 |
// wLengthL: transaction length |
|
| 63 |
|
|
| 57 | 64 |
// OUT commands |
| 58 | 65 |
|
| 59 | 66 |
#define VRQ_SET_LED 0x01 // wValueL off/on {0,1}; wIndexL: which {0,1}
|
| b/firmware/fx2/src/usrp1/spi.c | ||
|---|---|---|
| 97 | 97 |
static void |
| 98 | 98 |
write_byte_msb (unsigned char v); |
| 99 | 99 |
|
| 100 |
unsigned char |
|
| 101 |
transact_byte_msb (unsigned char v); |
|
| 102 |
|
|
| 100 | 103 |
static void |
| 101 | 104 |
write_bytes_msb (const xdata unsigned char *buf, unsigned char len); |
| 102 | 105 |
|
| 103 | 106 |
static void |
| 104 | 107 |
read_bytes_msb (xdata unsigned char *buf, unsigned char len); |
| 105 | 108 |
|
| 106 |
|
|
| 109 |
static void |
|
| 110 |
transact_bytes_msb (xdata unsigned char *buf, unsigned char len); |
|
| 111 |
|
|
| 107 | 112 |
// returns non-zero if successful, else 0 |
| 108 | 113 |
unsigned char |
| 109 | 114 |
spi_read (unsigned char header_hi, unsigned char header_lo, |
| ... | ... | |
| 214 | 219 |
return 1; // success |
| 215 | 220 |
} |
| 216 | 221 |
|
| 217 |
// ---------------------------------------------------------------- |
|
| 222 |
unsigned char |
|
| 223 |
spi_transact (unsigned char data0, unsigned char data1, |
|
| 224 |
unsigned char data2, unsigned char data3, |
|
| 225 |
unsigned char enables, xdata unsigned char *buf, |
|
| 226 |
unsigned char len) |
|
| 227 |
{
|
|
| 228 |
if (count_bits8 (enables) > 1) |
|
| 229 |
return 0; // error, too many enables set |
|
| 230 |
|
|
| 231 |
if (len > 4) |
|
| 232 |
return 0; |
|
| 233 |
|
|
| 234 |
setup_enables (enables); |
|
| 235 |
|
|
| 236 |
buf[0] = data0; |
|
| 237 |
buf[1] = data1; |
|
| 238 |
buf[2] = data2; |
|
| 239 |
buf[3] = data3; |
|
| 240 |
|
|
| 241 |
if (len != 0) |
|
| 242 |
transact_bytes_msb(buf, len); |
|
| 243 |
|
|
| 244 |
disable_all (); |
|
| 245 |
return 1; // success |
|
| 246 |
} |
|
| 247 |
|
|
| 248 |
static unsigned char |
|
| 249 |
transact_byte_msb (unsigned char v) |
|
| 250 |
{
|
|
| 251 |
v = (v << 1) | (v >> 7); // rotate left (MSB into bottom bit) |
|
| 252 |
bitS_OUT = v & 0x1; |
|
| 253 |
bitS_CLK = 1; |
|
| 254 |
v |= bitS_IN; // read into bottom bit |
|
| 255 |
bitS_CLK = 0; |
|
| 256 |
|
|
| 257 |
v = (v << 1) | (v >> 7); |
|
| 258 |
bitS_OUT = v & 0x1; |
|
| 259 |
bitS_CLK = 1; |
|
| 260 |
v |= bitS_IN; |
|
| 261 |
bitS_CLK = 0; |
|
| 262 |
|
|
| 263 |
v = (v << 1) | (v >> 7); |
|
| 264 |
bitS_OUT = v & 0x1; |
|
| 265 |
bitS_CLK = 1; |
|
| 266 |
v |= bitS_IN; |
|
| 267 |
bitS_CLK = 0; |
|
| 268 |
|
|
| 269 |
v = (v << 1) | (v >> 7); |
|
| 270 |
bitS_OUT = v & 0x1; |
|
| 271 |
bitS_CLK = 1; |
|
| 272 |
v |= bitS_IN; |
|
| 273 |
bitS_CLK = 0; |
|
| 274 |
|
|
| 275 |
v = (v << 1) | (v >> 7); |
|
| 276 |
bitS_OUT = v & 0x1; |
|
| 277 |
bitS_CLK = 1; |
|
| 278 |
v |= bitS_IN; |
|
| 279 |
bitS_CLK = 0; |
|
| 280 |
|
|
| 281 |
v = (v << 1) | (v >> 7); |
|
| 282 |
bitS_OUT = v & 0x1; |
|
| 283 |
bitS_CLK = 1; |
|
| 284 |
v |= bitS_IN; |
|
| 285 |
bitS_CLK = 0; |
|
| 286 |
|
|
| 287 |
v = (v << 1) | (v >> 7); |
|
| 288 |
bitS_OUT = v & 0x1; |
|
| 289 |
bitS_CLK = 1; |
|
| 290 |
v |= bitS_IN; |
|
| 291 |
bitS_CLK = 0; |
|
| 292 |
|
|
| 293 |
v = (v << 1) | (v >> 7); |
|
| 294 |
bitS_OUT = v & 0x1; |
|
| 295 |
bitS_CLK = 1; |
|
| 296 |
v |= bitS_IN; |
|
| 297 |
bitS_CLK = 0; |
|
| 298 |
|
|
| 299 |
return v; |
|
| 300 |
} |
|
| 301 |
|
|
| 302 |
static void |
|
| 303 |
transact_bytes_msb (xdata unsigned char *buf, unsigned char len) |
|
| 304 |
{
|
|
| 305 |
while (len-- != 0){
|
|
| 306 |
*buf++ = transact_byte_msb (*buf); |
|
| 307 |
} |
|
| 308 |
} |
|
| 218 | 309 |
|
| 219 | 310 |
static void |
| 220 | 311 |
write_byte_msb (unsigned char v) |
| b/firmware/fx2/src/usrp1/spi.h | ||
|---|---|---|
| 39 | 39 |
unsigned char enables, unsigned char format, |
| 40 | 40 |
const xdata unsigned char *buf, unsigned char len); |
| 41 | 41 |
|
| 42 |
// returns non-zero if successful, else 0 |
|
| 43 |
unsigned char |
|
| 44 |
spi_transact (unsigned char data0, unsigned char data1, |
|
| 45 |
unsigned char data2, unsigned char data3, |
|
| 46 |
unsigned char enables, xdata unsigned char *buf, |
|
| 47 |
unsigned char len); |
|
| 48 |
|
|
| 42 | 49 |
|
| 43 | 50 |
#endif /* INCLUDED_SPI_H */ |
| b/firmware/fx2/src/usrp1/usrp_main.c | ||
|---|---|---|
| 117 | 117 |
EP0BCH = 0; |
| 118 | 118 |
EP0BCL = wLengthL; |
| 119 | 119 |
break; |
| 120 |
|
|
| 120 |
|
|
| 121 | 121 |
case VRQ_SPI_READ: |
| 122 | 122 |
if (!spi_read (wValueH, wValueL, wIndexH, wIndexL, EP0BUF, wLengthL)) |
| 123 | 123 |
return 0; |
| ... | ... | |
| 126 | 126 |
EP0BCL = wLengthL; |
| 127 | 127 |
break; |
| 128 | 128 |
|
| 129 |
case VRQ_SPI_TRANSACT: |
|
| 130 |
if (!spi_transact (wValueH, wValueL, wIndexH, wIndexL, wLengthH, EP0BUF, wLengthL)) |
|
| 131 |
return 0; |
|
| 132 |
|
|
| 133 |
EP0BCH = 0; |
|
| 134 |
EP0BCL = wLengthL; |
|
| 135 |
break; |
|
| 136 |
|
|
| 129 | 137 |
default: |
| 130 | 138 |
return 0; |
| 131 | 139 |
} |
Also available in: Unified diff