Skip to main content
Visitor II
September 16, 2005
Question

ST7 problem

  • September 16, 2005
  • 3 replies
  • 881 views
Posted on September 16, 2005 at 07:07

ST7 problem

    This topic has been closed for replies.

    3 replies

    pete3Author
    Visitor II
    September 15, 2005
    Posted on September 15, 2005 at 10:49

    Hi all,

    I have narrowed a code error down to this loop:

    while(!(CMSR & 0x01))

    {

    CMCR |= 0x01;

    }

    from which the COSMIC compiler generates the following absolute listing:

    1235 850d 2002 jra L572

    1236 850f L372:

    1237 ; 444 CMCR |= 0x01;

    1238 850f 1068 bset _CMCR,#0

    1239 8511 L572:

    1240 ; 441 while(!(CMSR & 0x01))

    1241 8511 0169fb btjf _CMSR,#0,L372

    The problem is that the code is entered and runs either once or twice (normally twice, ~70% chance) but then code execution stops! I have checked this using SCI comms code and code immediately after this loop will not run. Code before this runs as expected.

    Does anyone have any ideas? I am programming the micro through an inDART ST7 which works fine.

    Visitor II
    September 16, 2005
    Posted on September 16, 2005 at 04:25

    What is the purpose of this code ? CMSR is a register ? Why loop is running 2 times , it shall be always once

    change it to

    if (!(CMSR & 0x01))

    {

    CMCR |= 0x01;

    }

    pete3Author
    Visitor II
    September 16, 2005
    Posted on September 16, 2005 at 07:07

    Sorry alok,

    CMSR is a status register. To put the CAN peripheral into initialisation mode, you need to set bit 0 of the CMCR register. It will then enter that mode when it is not receiving anything. I cannot guarantee that the module is doing nothing when this code runs, but the next lines require that the CAN module is in initialisation. When bit 0 of the CMSR is set, the module is in initialisation mode.

    My problem is that this code executes fine but that the line directly after it never executes.