Fixed bug #442.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6506 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
570949e7f4
commit
087e521ea9
|
@ -142,9 +142,7 @@ static void set_error(SerialDriver *sdp, uint16_t sr) {
|
|||
sts |= SD_FRAMING_ERROR;
|
||||
if (sr & USART_SR_NE)
|
||||
sts |= SD_NOISE_ERROR;
|
||||
osalSysLockFromISR();
|
||||
chnAddFlagsI(sdp, sts);
|
||||
osalSysUnlockFromISR();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -155,12 +153,8 @@ static void set_error(SerialDriver *sdp, uint16_t sr) {
|
|||
static void serve_interrupt(SerialDriver *sdp) {
|
||||
USART_TypeDef *u = sdp->usart;
|
||||
uint16_t cr1 = u->CR1;
|
||||
uint16_t sr = u->SR; /* SR reset step 1.*/
|
||||
uint16_t dr = u->DR; /* SR reset step 2.*/
|
||||
uint16_t sr = u->SR;
|
||||
|
||||
/* Error condition detection.*/
|
||||
if (sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE | USART_SR_PE))
|
||||
set_error(sdp, sr);
|
||||
/* Special case, LIN break detection.*/
|
||||
if (sr & USART_SR_LBD) {
|
||||
osalSysLockFromISR();
|
||||
|
@ -168,12 +162,18 @@ static void serve_interrupt(SerialDriver *sdp) {
|
|||
osalSysUnlockFromISR();
|
||||
u->SR &= ~USART_SR_LBD;
|
||||
}
|
||||
|
||||
/* Data available.*/
|
||||
if (sr & USART_SR_RXNE) {
|
||||
osalSysLockFromISR();
|
||||
sdIncomingDataI(sdp, (uint8_t)dr);
|
||||
osalSysUnlockFromISR();
|
||||
osalSysLockFromISR();
|
||||
while (sr & USART_SR_RXNE) {
|
||||
/* Error condition detection.*/
|
||||
if (sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE | USART_SR_PE))
|
||||
set_error(sdp, sr);
|
||||
sdIncomingDataI(sdp, u->DR);
|
||||
sr = u->SR;
|
||||
}
|
||||
osalSysUnlockFromISR();
|
||||
|
||||
/* Transmission buffer empty.*/
|
||||
if ((cr1 & USART_CR1_TXEIE) && (sr & USART_SR_TXE)) {
|
||||
msg_t b;
|
||||
|
@ -187,6 +187,7 @@ static void serve_interrupt(SerialDriver *sdp) {
|
|||
u->DR = b;
|
||||
osalSysUnlockFromISR();
|
||||
}
|
||||
|
||||
/* Physical transmission end.*/
|
||||
if (sr & USART_SR_TC) {
|
||||
osalSysLockFromISR();
|
||||
|
|
Loading…
Reference in New Issue