You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Play/akva/_256-27nrf/utility/u8g_com_msp430_hw_spi.c

221 lines
5.7 KiB

/*
u8g_com_msp430_hw_spi.c
Universal 8bit Graphics Library
Copyright (c) 2012, olikraus@gmail.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "u8g.h"
#if defined(__MSP430__)
#define U8G_MSP430_HW_SPI
#endif
#if defined(U8G_MSP430_HW_SPI)
#include <msp430.h>
#ifndef F_CPU
#error "Please specifiy actual master clock using F_CPU in HZ"
#endif
#ifndef F_SPI
#define F_SPI 1000000UL
#endif
#define U8G_USE_USCIA0 1
#define U8G_USE_USCIB0 2
#define U8G_USE_USCIA1 3
#define U8G_USE_USCIB1 4
#define U8G_USE_USCIA2 5
#define U8G_USE_USCIB2 6
#define U8G_USE_USCIA3 7
#define U8G_USE_USCIB3 8
#ifndef U8G_USE_USCI
#define U8G_USE_USCI U8G_USE_USCIB0
#endif
#if U8G_USE_USCI == 1
#define UCIFG UCA0IFG
#define UCTXBUF UCA0TXBUF
#define UCSTAT UCA0STAT
#define UCCTL0 UCA0CTL0
#define UCCTL1 UCA0CTL1
#define UCBR0 UCA0BR0
#define UCBR1 UCA0BR1
#elif U8G_USE_USCI == 2
#define UCIFG UCB0IFG
#define UCTXBUF UCB0TXBUF
#define UCSTAT UCB0STAT
#define UCCTL0 UCB0CTL0
#define UCCTL1 UCB0CTL1
#define UCBR0 UCB0BR0
#define UCBR1 UCB0BR1
#elif U8G_USE_USCI == 3
#define UCIFG UCA1IFG
#define UCTXBUF UCA1TXBUF
#define UCSTAT UCA1STAT
#define UCCTL0 UCA1CTL0
#define UCCTL1 UCA1CTL1
#define UCBR0 UCA1BR0
#define UCBR1 UCA1BR1
#elif U8G_USE_USCI == 4
#define UCIFG UCB1IFG
#define UCTXBUF UCB1TXBUF
#define UCSTAT UCB1STAT
#define UCCTL0 UCB1CTL0
#define UCCTL1 UCB1CTL1
#define UCBR0 UCB1BR0
#define UCBR1 UCB1BR1
#elif U8G_USE_USCI == 5
#define UCIFG UCA2IFG
#define UCTXBUF UCA2TXBUF
#define UCSTAT UCA2STAT
#define UCCTL0 UCA2CTL0
#define UCCTL1 UCA2CTL1
#define UCBR0 UCA2BR0
#define UCBR1 UCA2BR1
#elif U8G_USE_USCI == 6
#define UCIFG UCB2IFG
#define UCTXBUF UCB2TXBUF
#define UCSTAT UCB2STAT
#define UCCTL0 UCB2CTL0
#define UCCTL1 UCB2CTL1
#define UCBR0 UCB2BR0
#define UCBR1 UCB2BR1
#elif U8G_USE_USCI == 7
#define UCIFG UCA3IFG
#define UCTXBUF UCA3TXBUF
#define UCSTAT UCA3STAT
#define UCCTL0 UCA3CTL0
#define UCCTL1 UCA3CTL1
#define UCBR0 UCA3BR0
#define UCBR1 UCA3BR1
#elif U8G_USE_USCI == 8
#define UCIFG UCB3IFG
#define UCTXBUF UCB3TXBUF
#define UCSTAT UCB3STAT
#define UCCTL0 UCB3CTL0
#define UCCTL1 UCB3CTL1
#define UCBR0 UCB3BR0
#define UCBR1 UCB3BR1
#endif
inline void u8g_msp430_spi_out(uint8_t data)
{
while (!(UCIFG&UCTXIFG));
UCTXBUF = data;
}
uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
switch(msg)
{
case U8G_COM_MSG_STOP:
break;
case U8G_COM_MSG_INIT:
/*
* on MSP430 you need to set PSEL alternative function which
* may not be required on other MCU's - should be handled
* by a low level u8g_SetPinAlternate(pin_number)...
*/
UCCTL1 |= UCSWRST; // **Put state machine in reset**
UCCTL0 |= UCMST|UCSYNC|UCCKPL|UCMSB; // 3-pin, 8-bit SPI master Clock polarity high, MSB
UCCTL1 |= UCSSEL_2; // SMCLK
UCBR0 = (unsigned char)(F_CPU/F_SPI); //
UCBR1 = 0; //
UCCTL1 &= ~UCSWRST; // **Initialize USCI state machine**
u8g_SetPILevel(u8g, U8G_PI_CS, 1);
u8g_SetPILevel(u8g, U8G_PI_A0, 1);
u8g_SetPILevel(u8g, U8G_PI_RESET, 1);
u8g_SetPIOutput(u8g, U8G_PI_CS);
u8g_SetPIOutput(u8g, U8G_PI_A0);
u8g_SetPIOutput(u8g, U8G_PI_RESET);
break;
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
break;
case U8G_COM_MSG_CHIP_SELECT:
u8g_SetPILevel(u8g, U8G_PI_CS, (arg_val ? 0 : 1));
break;
case U8G_COM_MSG_RESET:
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
break;
case U8G_COM_MSG_WRITE_BYTE:
u8g_msp430_spi_out(arg_val);
while ((UCSTAT&UCBUSY));
break;
case U8G_COM_MSG_WRITE_SEQ:
{
register uint8_t *ptr = arg_ptr;
while( arg_val > 0 )
{
u8g_msp430_spi_out(*ptr++);
arg_val--;
}
while ((UCSTAT&UCBUSY));
}
break;
case U8G_COM_MSG_WRITE_SEQ_P:
{
register uint8_t *ptr = arg_ptr;
while( arg_val > 0 )
{
u8g_msp430_spi_out(u8g_pgm_read(ptr));
ptr++;
arg_val--;
}
while ((UCSTAT&UCBUSY));
}
break;
}
return 1;
}
#else
uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
return 1;
}
#endif