Problem with LRAE bootloader for 9S12XEP100

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

Problem with LRAE bootloader for 9S12XEP100

跳至解决方案
2,389 次查看
cs_Lukasz
Contributor III

I have strange problem with LRAE bootloader. To example code from AN2546 I add a few lines which send by SCI the string: "LRAE\n". Code:

 

    if (*(tU16 *)APPLICATION_START == ERASED)
    {                                               
                                                    /* ensure interrupts are disabled */
        asm sei;                   
       
      /* initialise the system clock. Fbus = 8MHz. Assumes 4MHz Oscillator */
   CRG.synr.byte = 0x3;         /* configure the PLL */
   CRG.refdv.byte = 0x40;
   CRG.postdiv.byte = 0x1;
   while(!CRG.crgflg.bit.lock)    /* wait for PLL to lock */
   {
   }
     CRG.clksel.bit.pllsel = 1; /*select the PLL as the clock source */
       
                                                    /* continue with the LRAE routines */
       
        asm lds #$4000;       
                                                           

        //Initialize();
           
        Delay(500);
       
      SCI0.scibdh.byte = 0;
       SCI0.scibdl.byte = SCI_Prescaler[0];
      
                                                    /* enable SCI0 to receive */
        SCI0.scicr2.bit.re = 1;   
        SCI0.scicr2.bit.te = 1;           
         
        while (SCI_Ptr->scisr1.bit.tdre == 0){}; // Wait until Transmit Data Register is empty.
        SCI_Ptr->scicr2.bit.te = 1;                           
        SCI_Ptr->scidrl.byte = 'L';   
        while (SCI_Ptr->scisr1.bit.tdre == 0){}; // Wait until Transmit Data Register is empty.
        SCI_Ptr->scicr2.bit.te = 1;                           
        SCI_Ptr->scidrl.byte = 'R';   
        while (SCI_Ptr->scisr1.bit.tdre == 0){}; // Wait until Transmit Data Register is empty.
        SCI_Ptr->scicr2.bit.te = 1;                           
        SCI_Ptr->scidrl.byte = 'A';   
        while (SCI_Ptr->scisr1.bit.tdre == 0){}; // Wait until Transmit Data Register is empty.
        SCI_Ptr->scicr2.bit.te = 1;                           
        SCI_Ptr->scidrl.byte = 'E';       
        while (SCI_Ptr->scisr1.bit.tdre == 0){}; // Wait until Transmit Data Register is empty.
        SCI_Ptr->scicr2.bit.te = 1;                           
        SCI_Ptr->scidrl.byte = '\n';    

 

......................................................

 

 Problem is showing as follows:

 - LRAE starts,

- *(tU16 *)APPLICATION_START is empty so LRAE is configuring PLL, SCI

- "LRAE\n" string is sending, but not always. Usually < 50% of resets causes sending of this string. But when I turn on debug and put a breakpoint on first line:

while (SCI_Ptr->scisr1.bit.tdre == 0){};

I see the all instructions below are executed! However I dont receive any bytes on PC. I check register SCI0 and all is ok.

 

 I dont now where the problem is. Please help me.

 

Best regards

Lukasz

标签 (1)
0 项奖励
回复
1 解答
1,127 次查看
cs_Lukasz
Contributor III

Thanks for reply. Admittedly this is not guilt of .te bit. They have no sense they are setted all the time I wand send a char. But I find my bug :smileyhappy:. I dont set a pointer SCI_Ptr before a section which send "LRAE" string but after, when LRAE is waiting for synchronization byte 0x55. Because of sometimes afer reset pointer was correct and sometimes wasn't.

 

However thanks because you impel me to check a values of registers :smileyhappy:

 

Best regards

Lukasz

在原帖中查看解决方案

0 项奖励
回复
3 回复数
1,127 次查看
kef
Specialist I

Writing to SCICR2 register should queue idle character preambule for transmition (please check the docs). If it queues idle char for transmision, then in case transfer is already in progress, TDRE bit should get cleared after setting .te=1. And your core looks as follows:

 

        SCI_Ptr->scidrl.byte = 'L';   
        while (SCI_Ptr->scisr1.bit.tdre == 0){}; // Wait until Transmit Data Register is empty.
        SCI_Ptr->scicr2.bit.te = 1;                           
        SCI_Ptr->scidrl.byte = 'R';    

 

^^ here you queue 'L' char, wait for TDRE=1, queue idle character by setting .te=1, then without waiting for TDRE=1, you write 'R' to data register.

 

I think you should either remove .te=1 lines, or add necessary loops while(!TDRE).

0 项奖励
回复
1,128 次查看
cs_Lukasz
Contributor III

Thanks for reply. Admittedly this is not guilt of .te bit. They have no sense they are setted all the time I wand send a char. But I find my bug :smileyhappy:. I dont set a pointer SCI_Ptr before a section which send "LRAE" string but after, when LRAE is waiting for synchronization byte 0x55. Because of sometimes afer reset pointer was correct and sometimes wasn't.

 

However thanks because you impel me to check a values of registers :smileyhappy:

 

Best regards

Lukasz

0 项奖励
回复
1,127 次查看
kef
Specialist I
Sorry for bad advice. Your .te=1 between chars attracted my attention. I'm never sending idle characters and bad memory told me they are queued on every write to SCICR2, not only when TE changes from 0 to 1. Glad you fixed it. Cześć.
0 项奖励
回复