int16_t motor_command(int16_t command) { unsigned int config = SPI_CON_MODE16 | SPI_CON_MSTEN | SPI_CON_CKE; // the last number is the clock divider SpiChnOpen(SPI_CHANNEL2, config, 256); //256 works // 4 doesn't //8 doesn't //16 doesn't //32 doesn't //64 doesn't //128 doesn't MDBSS = 0; waitabit(WAIT_TIME); SpiChnPutC(2, command); int16_t velocity = SpiChnGetC(2); MDBSS = 1; SpiChnClose(SPI_CHANNEL2); return velocity; }
BOOL ConfigSPIComms(void) { SpiChnClose(RPI_SPI_CHANNEL); /* do I need to configure this? */ INTEnable(INT_SOURCE_SPI_RX(RPI_SPI_CHANNEL),INT_DISABLED); INTEnable(INT_SOURCE_SPI_TX(RPI_SPI_CHANNEL),INT_DISABLED); INTEnable(INT_SOURCE_SPI_ERROR(RPI_SPI_CHANNEL),INT_DISABLED); INTEnable(INT_SOURCE_SPI(RPI_SPI_CHANNEL),INT_DISABLED); SPI_DATA_IN_DIRECTION = TRIS_IN; SPI_DATA_OUT_DIRECTION = TRIS_OUT; SPI_CLOCK_IN_DIRECTION = TRIS_IN; SPI_SELECT_IN_DIRECTION = TRIS_IN; SPI.RXCount=0; SPI.TXCount=0; SPI.address=0; SPI.command=TRISTHIS_SPI_NO_COMMAND; SpiChnOpen(RPI_SPI_CHANNEL, SPI_OPEN_SLVEN|SPI_OPEN_CKE_REV|SPI_OPEN_MODE8|SPI_OPEN_SSEN, 0); //TODO: Not acting consistently? RPI needs to send -b 8 -H parameters to spidev /* configure interrupts */ INTSetVectorPriority(INT_VECTOR_SPI(RPI_SPI_CHANNEL), INT_PRIORITY_LEVEL_3); INTSetVectorSubPriority(INT_VECTOR_SPI(RPI_SPI_CHANNEL), INT_SUB_PRIORITY_LEVEL_1); INTClearFlag(INT_SOURCE_SPI_RX(RPI_SPI_CHANNEL)); INTEnable(INT_SOURCE_SPI_RX(RPI_SPI_CHANNEL),INT_ENABLED); INTClearFlag(INT_SOURCE_SPI_TX(RPI_SPI_CHANNEL)); INTClearFlag(INT_SOURCE_SPI_ERROR(RPI_SPI_CHANNEL)); INTClearFlag(INT_SOURCE_SPI(RPI_SPI_CHANNEL)); //INTEnable(INT_SOURCE_SPI(RPI_SPI_CHANNEL),INT_ENABLED); /* configure change notice, as I can't figure out any other way to */ /* trigger the beginning of the slave select with just the SPI peripheral */ /* buuut the change notice pins are not on the SS pins, so a white wire is*/ /* needed */ /* tie chip enable CE0 to pin20/RE5 CE1 */ SPI_SELECT_CN_DIRECTION=TRIS_IN; CNCONbits.w=0; CNCONSET=_CNCON_ON_MASK; CNENbits.w=0; CNENSET=_CNEN_CNEN7_MASK; CNTemp=CE_PORT; /* read for change notice */ RPI_SPI_RX_OVERFLOW_CLEAR; SPI1CONbits.STXISEL=0b01; SPI.status.w=0; INTClearFlag(INT_CN); INTSetVectorPriority(INT_CHANGE_NOTICE_VECTOR, INT_PRIORITY_LEVEL_2); INTSetVectorSubPriority(INT_CHANGE_NOTICE_VECTOR, INT_SUB_PRIORITY_LEVEL_1); return TRUE; }
void MySPI_Close(void) { SpiChnClose(SPI_CHANNEL1A); }