void systemInit()
{
cpuInit();
systickInit((CFG_CPU_CCLK / 1000) * CFG_SYSTICK_DELAY_IN_MS);
pmuInit();
// Initialise UART with the default baud rate (set in projectconfig.h)
uartInit(CFG_UART_BAUDRATE);
// Set LED pin as output and turn LED off
gpioSetDir(CFG_LED_PORT, CFG_LED_PIN, 1);
gpioSetValue(CFG_LED_PORT, CFG_LED_PIN, CFG_LED_ON);
// Set GPIO0_11 and GPIO1.0 to INPUT
gpioSetDir(0, 11, gpioDirection_Input);
gpioSetDir(1, 0, gpioDirection_Input);
// Disable the internal pullup/down resistor on P0.11 and P1.0
gpioSetPullup (&IOCON_JTAG_TDI_PIO0_11, gpioPullupMode_Inactive);
gpioSetPullup (&IOCON_JTAG_TMS_PIO1_0 , gpioPullupMode_Inactive);
// Setup an interrupt on GPIO0.11
gpioSetInterrupt(0, // Port
11, // Pin
gpioInterruptSense_Edge, // Edge Sensitive
gpioInterruptEdge_Single, // Single Edge
gpioInterruptEvent_ActiveLow); // Active Low
// Setup an interrupt on GPIO1.0
gpioSetInterrupt(1, // Port
0, // Pin
gpioInterruptSense_Edge, // Edge Sensitive
gpioInterruptEdge_Single, // Single Edge
gpioInterruptEvent_ActiveLow); // Active Low
// Enable the interrupts
gpioIntEnable(0, 11);
gpioIntEnable(1, 0);
// Initialise and Configure LIS331
#ifdef CFG_LIS331
accdata_t X, Y, Z;
accsensorInit();
lis331GetAcceleration (&X, &Y, &Z);
#endif
}
lis331Error_e lis331GetAcceleration (accdata_t *ax, accdata_t *ay, accdata_t *az)
{
if (!_lis331Initialised) lis331Init();
// Read accelerations
lis331Read16 (LIS331_OUT_X_L_A, &ax->data);
lis331Read16 (LIS331_OUT_Y_L_A, &ay->data);
lis331Read16 (LIS331_OUT_Z_L_A, &az->data);
return LIS331_ERROR_OK;
}
static lis331Error_e lis331Read16(uint8_t reg, int16_t *value)
{
if (!_lis331Initialised) lis331Init();
uint32_t i;
// Clear buffers
for ( i = 0; i < I2C_BUFSIZE; i++ )
{
I2CMasterBuffer = 0x00;
I2CSlaveBuffer = 0x00;
}
I2CWriteLength = 2;
I2CReadLength = 2;
I2CMasterBuffer[0] = LIS331_ADDRESS_WRITE; // I2C device Write address
I2CMasterBuffer[1] = reg | I2C_AUTO_INCREMENT; // Command register just for data acceleration registers)
I2CMasterBuffer[2] = LIS331_ADDRESS_READ; // I2C device Read address
i2cEngine();
// Shift values to create properly formed integer
*value = ((I2CSlaveBuffer[1] << 8) | I2CSlaveBuffer[0]) >> 4;
// Sign extend negative numbers
if (I2CSlaveBuffer[1] & 0x80)
{
// Negative value
*value ^= *value;
*value += 1;
}
return LIS331_ERROR_OK;
}
int main(void)
{
sysinit();
while (1){
GPIO_GPIO3DATA ^= (1 << CFG_LED_PIN);
systickDelay(30);
// IRQ ACCELEROMETER
uartSendByte(gpio1_counter);
if(_accInt1Initialised == true){
accInt1Handler();
}
return 0;
}
void accInt1Handler(void)
{
lis331GetAcceleration (&aX, &aY, &aZ);
uartBuffer[1] = aX.byte[1];
uartBuffer[2] = aX.byte[0];
uartBuffer[4] = aY.byte[1];
uartBuffer[5] = aY.byte[0];
uartBuffer[7] = aZ.byte[1];
uartBuffer[8] = aZ.byte[0];
uartSend((uint8_t *)uartBuffer, 10);
_accInt1Initialised = false;
}
void PIOINT1_IRQHandler(void)
{
if (GPIO_GPIO1MIS & 0x01)
{
gpio1_counter++;
_accInt1Initialised = true;
GPIO_GPIO1IC |= 0x01;
__asm volatile ("nop"); // Recommended in Datasheet
__asm volatile ("nop");
}
return;
}
|