mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-01 09:24:10 +01:00
Enable and disable interrupts in TransferStart() and TransferEnd() functions
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@250 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
parent
7de6be3f59
commit
b3ad53acdc
@ -30,10 +30,14 @@
|
|||||||
/* Project Includes */
|
/* Project Includes */
|
||||||
#include "pios.h"
|
#include "pios.h"
|
||||||
|
|
||||||
|
// FIXME: temp assert
|
||||||
|
#define assert(exp) {if (!(exp)) while(1);}
|
||||||
|
|
||||||
|
|
||||||
#if !defined(PIOS_DONT_USE_I2C)
|
#if !defined(PIOS_DONT_USE_I2C)
|
||||||
|
|
||||||
/* Options */
|
/* Options */
|
||||||
//#define USE_DEBUG_PINS
|
#define USE_DEBUG_PINS
|
||||||
|
|
||||||
/* Global Variables */
|
/* Global Variables */
|
||||||
volatile uint32_t PIOS_I2C_UnexpectedEvent;
|
volatile uint32_t PIOS_I2C_UnexpectedEvent;
|
||||||
@ -228,6 +232,9 @@ static void TransferStart(I2CRecTypeDef *i2cx)
|
|||||||
{
|
{
|
||||||
DebugPinHigh(DEBUG_PIN_BUSY);
|
DebugPinHigh(DEBUG_PIN_BUSY);
|
||||||
i2cx->transfer_state.BUSY = 1;
|
i2cx->transfer_state.BUSY = 1;
|
||||||
|
|
||||||
|
// Enable Interrupts: I2V2 event, buffer and error interrupt
|
||||||
|
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -235,6 +242,9 @@ static void TransferStart(I2CRecTypeDef *i2cx)
|
|||||||
*/
|
*/
|
||||||
static void TransferEnd(I2CRecTypeDef *i2cx)
|
static void TransferEnd(I2CRecTypeDef *i2cx)
|
||||||
{
|
{
|
||||||
|
// Disable all interrupts
|
||||||
|
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
||||||
|
|
||||||
DebugPinLow(DEBUG_PIN_BUSY);
|
DebugPinLow(DEBUG_PIN_BUSY);
|
||||||
i2cx->transfer_state.BUSY = 0;
|
i2cx->transfer_state.BUSY = 0;
|
||||||
}
|
}
|
||||||
@ -356,9 +366,9 @@ int32_t PIOS_I2C_Transfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t
|
|||||||
return error + I2C_ERROR_PREV_OFFSET;
|
return error + I2C_ERROR_PREV_OFFSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Should not be busy at this point, interrupts disabled
|
||||||
|
assert(i2cx->transfer_state.BUSY == 0);
|
||||||
|
|
||||||
/* Disable interrupts */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
|
|
||||||
/* Clear transfer state and error value */
|
/* Clear transfer state and error value */
|
||||||
i2cx->transfer_state.ALL = 0;
|
i2cx->transfer_state.ALL = 0;
|
||||||
@ -391,24 +401,11 @@ int32_t PIOS_I2C_Transfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t
|
|||||||
return (i2cx->last_transfer_error=I2C_ERROR_UNSUPPORTED_TRANSFER_TYPE);
|
return (i2cx->last_transfer_error=I2C_ERROR_UNSUPPORTED_TRANSFER_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start with ACK */
|
// Start the transfer
|
||||||
I2C_AcknowledgeConfig(i2cx->base, ENABLE);
|
|
||||||
|
|
||||||
/* Clear last error status */
|
|
||||||
i2cx->last_transfer_error = 0;
|
|
||||||
|
|
||||||
/* Notify that transfer has started */
|
|
||||||
TransferStart(i2cx);
|
TransferStart(i2cx);
|
||||||
|
|
||||||
/* Send start condition */
|
|
||||||
I2C_GenerateSTART(i2cx->base, ENABLE);
|
I2C_GenerateSTART(i2cx->base, ENABLE);
|
||||||
|
|
||||||
/* Enable I2V2 event, buffer and error interrupt */
|
// All is fine
|
||||||
/* This must be done *after* GenerateStart, for the case last transfer was WRITE_WITHOUT_STOP. */
|
|
||||||
/* In this case, start was already generated at the end of the last communication! */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE);
|
|
||||||
|
|
||||||
/* No error */
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,8 +441,6 @@ static void EV_IRQHandler(I2CRecTypeDef *i2cx)
|
|||||||
/* Last byte received, disable interrupts and return. */
|
/* Last byte received, disable interrupts and return. */
|
||||||
if(i2cx->transfer_state.STOP_REQUESTED) {
|
if(i2cx->transfer_state.STOP_REQUESTED) {
|
||||||
TransferEnd(i2cx);
|
TransferEnd(i2cx);
|
||||||
/* Disable all interrupts */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
DebugPinLow(DEBUG_PIN_ISR);
|
DebugPinLow(DEBUG_PIN_ISR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -486,8 +481,6 @@ static void EV_IRQHandler(I2CRecTypeDef *i2cx)
|
|||||||
/* Last byte already sent, disable interrupts and return. */
|
/* Last byte already sent, disable interrupts and return. */
|
||||||
if(i2cx->transfer_state.STOP_REQUESTED) {
|
if(i2cx->transfer_state.STOP_REQUESTED) {
|
||||||
TransferEnd(i2cx);
|
TransferEnd(i2cx);
|
||||||
/* Disable all interrupts */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
DebugPinLow(DEBUG_PIN_ISR);
|
DebugPinLow(DEBUG_PIN_ISR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -507,17 +500,11 @@ static void EV_IRQHandler(I2CRecTypeDef *i2cx)
|
|||||||
i2cx->transfer_state.STOP_REQUESTED = 1;
|
i2cx->transfer_state.STOP_REQUESTED = 1;
|
||||||
DebugPinLow(2);
|
DebugPinLow(2);
|
||||||
} else {
|
} else {
|
||||||
//I2C_GenerateSTART(i2cx->base, ENABLE);
|
|
||||||
//i2cx->transfer_state.STOP_REQUESTED = 1;
|
|
||||||
TransferEnd(i2cx);
|
TransferEnd(i2cx);
|
||||||
/* Disable all interrupts */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i2cx->buffer_len == 0) {
|
if(i2cx->buffer_len == 0) {
|
||||||
TransferEnd(i2cx);
|
TransferEnd(i2cx);
|
||||||
/* Disable all interrupts */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
} else {
|
} else {
|
||||||
/* Disable the I2C_IT_BUF interrupt after sending the last buffer data */
|
/* Disable the I2C_IT_BUF interrupt after sending the last buffer data */
|
||||||
/* (last EV8) to not allow a new interrupt just with TxE - only BTF will generate it */
|
/* (last EV8) to not allow a new interrupt just with TxE - only BTF will generate it */
|
||||||
@ -534,8 +521,6 @@ static void EV_IRQHandler(I2CRecTypeDef *i2cx)
|
|||||||
/* We have to wait for the application to start the next transfer */
|
/* We have to wait for the application to start the next transfer */
|
||||||
if(i2cx->transfer_state.STOP_REQUESTED) {
|
if(i2cx->transfer_state.STOP_REQUESTED) {
|
||||||
TransferEnd(i2cx);
|
TransferEnd(i2cx);
|
||||||
/* Disable all interrupts */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
DebugPinLow(DEBUG_PIN_ISR);
|
DebugPinLow(DEBUG_PIN_ISR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -552,7 +537,6 @@ static void EV_IRQHandler(I2CRecTypeDef *i2cx)
|
|||||||
/* This code is only reached if something got wrong, e.g. interrupt handler is called too late, */
|
/* This code is only reached if something got wrong, e.g. interrupt handler is called too late, */
|
||||||
/* The device reset itself (while testing, it was always event 0x00000000). we have to stop the transfer, */
|
/* The device reset itself (while testing, it was always event 0x00000000). we have to stop the transfer, */
|
||||||
/* Else read/write of corrupt data may be the result. */
|
/* Else read/write of corrupt data may be the result. */
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
|
|
||||||
/* Notify error */
|
/* Notify error */
|
||||||
PIOS_I2C_UnexpectedEvent = event;
|
PIOS_I2C_UnexpectedEvent = event;
|
||||||
@ -601,9 +585,6 @@ static void ER_IRQHandler(I2CRecTypeDef *i2cx)
|
|||||||
I2C_GenerateSTOP(i2cx->base, ENABLE);
|
I2C_GenerateSTOP(i2cx->base, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable interrupts */
|
|
||||||
I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE);
|
|
||||||
|
|
||||||
/* Notify that transfer has finished (due to the error) */
|
/* Notify that transfer has finished (due to the error) */
|
||||||
TransferEnd(i2cx);
|
TransferEnd(i2cx);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user