[Efi332] Queued SCI transmit with interrupts on MPC555

John Honnold jmhonnold4862
Thu Dec 8 19:27:15 UTC 2005


David:

   I am swamped today.  I will call you tomorrow.

Regards,

John Honnold

--- David Eicher <sailors3 at comcast.net> wrote:

> Hi John,
> 
>  
> 
> This morning I got up, fired up the machine, and ran
> this again. Now it does
> not work..., it ran several times last night but
> after being powered down
> all night, it does not. I must have had the hardware
> in some state that
> allowed it to work, which I can't duplicate this
> morning. So, I'm still
> trying to figure out a combination of "start
> transmit" code and ISR that
> will keep the queue transmitting reliably. Does you
> or anyone have an
> suggestions about what is wrong/missing from this
> code?
> 
>  
> 
> Thanks,
> 
>  
> 
> Dave
> 
>  
> 
>  
> 
>  
> 
>   _____  
> 
> From: efi332-bounces at diy-efi.org
> [mailto:efi332-bounces at diy-efi.org] On
> Behalf Of David Eicher
> Sent: Wednesday, December 07, 2005 9:25 PM
> To: efi332 at diy-efi.org
> Subject: RE: [Efi332] Queued SCI transmit with
> interrupts on MPC555
> 
>  
> 
> Hi John,
> 
> Thanks for your response. Yep, I'm trying to get the
> QSCI to work on the
> MPC555 for transmit. I've just got a block of data I
> need to transmit.
> 
> I've implemented the code per the demo code in the
> quickstart package, it
> just flat does not work for me. I've tried both use
> the two interrupts (QBHE
> and QTHE), and tried just using the QBHE interrupt
> alone (filling queue with
> 16 bytes each time), and had no success for many
> hours.
> 
> Just earlier tonight I finally managed to get one
> approach to the point it
> appears it is working (more testing required yet
> though). I'm using just the
> QBHE interrupt and flag, filling the queue with 16
> bytes each time. The demo
> code does not include a "set QTE and TE" in the ISR
> after the queue is
> loaded, but it doesn't seem to transmit without it.
> There is nothing I've
> found in the users manual for MPC555 that indicates
> that this is required,
> but I've had to keep turning the queue on over and
> over again to keep it
> transmitting. 
> 
> Is this correct? Or am I just bandaiding some error
> in my code with the
> setting of QTE and TE?
> 
> I"ll include the code I've found that works, I'd
> appreciate your comments on
> it:
> 
> Thanks much,
> 
> Dave
> 
>
---------------------------------------------------------
> start transmit
>
-----------------------------------------------------------------
> 
>  
> 
>             for (i=0;i<16;i++) scratch[i] = 'a';
> 
>             
> 
>             ioctl(QSMCM_QSCI1, QSCI_ENABLE_TX_WRAP,
> SCI_ENABLE); 
> 
>             ioctl(QSMCM_QSCI1,
> QSCI_WRITE_QUEUE_TX_SIZE, 16);
> 
>             
> 
>             /* read SR with TC set */
> 
>             while(!(ioctl(QSMCM_SCI1, SCI_GET_FLAGS,
> SCI_TX_COMPLETE))) {;}
> 
> 
>             
> 
>  
> 
>               /* fill the whole buffer */  
> 
>               write(QSMCM_QSCI1, QUEUE_TOP_HALF,
> scratch, 16);
> 
>  
> 
>               /* Clear top half and bottom half
> flags QTHE/QBHE */
> 
>               ioctl(QSMCM_QSCI1,
> QSCI_CLEAR_QUEUE_FLAGS, QSCI_TX_TOP_HALF);
> 
>               ioctl(QSMCM_QSCI1,
> QSCI_CLEAR_QUEUE_FLAGS, QSCI_TX_BOT_HALF);
> 
>             
> 
>               /* Set queued enable flag in control
> register QTE */
> 
> 
>               ioctl(QSMCM_QSCI1, QSCI_QUEUE_TX,
> SCI_ENABLE);
> 
>               /* Set QSCI transmit enable flag in
> control register TE */
> 
>               ioctl(QSMCM_SCI1, SCI_TRANSMITTER,
> SCI_ENABLE);
> 
>  
> 
>  
> 
>
---------------------------------------------------------
> ISR
>
----------------------------------------------------------------------------
> ---
> 
>  
> 
>   if (ioctl(QSMCM_QSCI1, QSCI_GET_QUEUE_FLAGS,
> QSCI_TX_BOT_HALF))
> 
>   {
> 
>       ioctl(QSMCM_QSCI1, QSCI_ENABLE_TX_WRAP,
> SCI_ENABLE); 
> 
>       ioctl(QSMCM_QSCI1, QSCI_WRITE_QUEUE_TX_SIZE,
> 16);
> 
>        /* read SR with TC set */
> 
>       while(!(ioctl(QSMCM_SCI1, SCI_GET_FLAGS,
> SCI_TX_COMPLETE))) {;}  
> 
>       for (i=0;i<14;i++) scratch[i] = 'c';
> 
>       scratch[14] = (u_char)13;
> 
>       scratch[15] = (u_char)10;
> 
>       write(QSMCM_QSCI1, QUEUE_TOP_HALF, scratch,
> 16);
> 
>       ioctl(QSMCM_QSCI1, QSCI_CLEAR_QUEUE_FLAGS,
> QSCI_TX_TOP_HALF);
> 
>       ioctl(QSMCM_QSCI1, QSCI_CLEAR_QUEUE_FLAGS,
> QSCI_TX_BOT_HALF);
> 
>       if (data[0]< 6)  /* stop after 5 interrupts */
> 
>       {
> 
>          ioctl(QSMCM_QSCI1, QSCI_QUEUE_TX,
> SCI_ENABLE);
> 
>          ioctl(QSMCM_SCI1, SCI_TRANSMITTER,
> SCI_ENABLE);
> 
>       }
> 
>       else
> 
>       {
> 
>          ioctl(QSMCM_QSCI1, QSCI_QUEUE_TX,
> SCI_DISABLE);
> 
>          ioctl(QSMCM_SCI1, SCI_TRANSMITTER,
> SCI_DISABLE);
> 
>       }
> 
>    }
> 
>  
> 
>  
> 
> -----Original Message-----
> From: efi332-bounces at diy-efi.org
> [mailto:efi332-bounces at diy-efi.org] On
> Behalf Of John Honnold
> Sent: Wednesday, December 07, 2005 1:31 PM
> To: efi332 at diy-efi.org
> Subject: Re: [Efi332] Queued SCI transmit with
> interrupts on MPC555
> 
> David:
> 
>    What seems to be the problem?  I work for
> Freescale
> 
> with the MCUs, so I may be able to help.  Let me
> know
> 
> some specifics.
> 
> Regards,
> 
> John Honnold
> 
> > _______________________________________________
> Efi332 mailing list
> Efi332 at diy-efi.org
> http://lists.diy-efi.org/mailman/listinfo/efi332
> 





More information about the Efi332 mailing list