I want to port a SPI code from MSP430 to the newly CC2533
The MSP430 SPI code is like this:
// MSP430 Port 1: P1.4, P1.5, p1.6 (unnamed), p1.7
#define CSB_PIN BIT4
#define MOSI_PIN BIT7
#define SCLK_PIN BIT5
#define CSB_LOW P1OUT &= ~CSB_PIN
#define CSB_HIGH P1OUT |= CSB_PIN
#define SCLK_LOW P1OUT &= ~SCLK_PIN
#define SCLK_HIGH P1OUT |= SCLK_PIN
//#define RESB_LOW P1OUT &= ~RESB_PIN
//#define RESB_HIGH P1OUT |= RESB_PIN
#define MOSI_LOW P1OUT &= ~MOSI_PIN
#define MOSI_HIGH P1OUT |= MOSI_PIN
#define DELAY __delay_cycles(10000)
// Uses bitbanging if no USCI
#ifdef UCB0CTL0_
// Support for USCI_B0
void SPISetup(void)
{
// Reset (not necessary when HW reset is on board)
//P1DIR |= RESB_PIN;
//P1OUT &= ~(RESB_PIN);
DELAY;
//P1OUT |= RESB_PIN;
DELAY;
P1OUT |= CSB_PIN;
P1DIR |= CSB_PIN; // /CS disable
UCB0CTL1 |= UCSWRST; // Disable USCI state machine
UCB0CTL0 |= UCMST+UCCKPH+UCMSB+UCSYNC; // 3-pin, 8-bit SPI master
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 = 0x02; // UCLK/2
UCB0BR1 = 0;
P1SEL |= MOSI_PIN | BIT6 | SCLK_PIN;
P1SEL2 |= MOSI_PIN | BIT6 | SCLK_PIN;
// SPI option select
P1DIR |= MOSI_PIN | SCLK_PIN;
// SPI TXD out direction
UCB0CTL1 &= ~UCSWRST; // Initialize USCI state machine
}
// HW SPI write
void SPIWrite(char addr, char value)
{
char first = (addr << 7) | (value >> 1);
char second = (value << 7);
P1OUT &= ~CSB_PIN; // /CS enable
while (!(IFG2&UCB0TXIFG)); // Wait for TXBUF ready
UCB0TXBUF = first; // Send address
while (!(IFG2&UCB0TXIFG)); // Wait for TXBUF ready
UCB0TXBUF = second; // Send data
while (UCB0STAT & UCBUSY); // Wait for TX to complete
P1OUT |= CSB_PIN; // /CS disable
}
#else
// Bit banging setup code
#warning Bitbanging SPI use
void SPISetup(void)
{
P1OUT |= CSB_PIN | MOSI_PIN | SCLK_PIN;
P1DIR |= CSB_PIN | MOSI_PIN | SCLK_PIN; // /CS disable
P1OUT &= ~( CSB_PIN | SCLK_PIN);
DELAY;
DELAY;
}
// Bitbanging code
void SPIWrite(char conf, char value)
{
CSB_LOW; // /CS enable
if (conf) {
P1OUT &= ~SCLK_PIN;
P1OUT |= MOSI_PIN;
}
else {
P1OUT &= ~(SCLK_PIN | MOSI_PIN);
}
P1OUT |= SCLK_PIN;
int mask = 0x0080;
while((mask & 0xFF)) {
if(value & mask) {
P1OUT &= ~SCLK_PIN;
P1OUT |= MOSI_PIN;
} else {
P1OUT &= ~(SCLK_PIN | MOSI_PIN);
}
P1OUT |= SCLK_PIN;
mask >>= 1;
}
CSB_HIGH; // /CS disable
}
#endif
Thanks!