- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
I want interrupt driven data transmission.
My tx_buff size is 8 bytes. its is working fine unless i have tx less than 8 bytes,.
But above that data is not transmitted.
pls help me
regards
santosh
this is my init code
UART_InterComm_SetCustomInterruptHandler(&Uart_InterComm_RxIntHandler);//start Rx and Tx interrupt
UART_InterComm_Start();
UART_InterComm_ClearRxInterruptSource(UART_InterComm_INTR_RX_NOT_EMPTY);
UART_InterComm_ClearTxInterruptSource(UART_InterComm_INTR_TX_NOT_FULL); //5.12.2018 clear Tx_EMPTY interrupt
UART_InterComm_SetTxInterrupt(0- UART_InterComm_INTR_TX_NOT_FULL);
isr
void Uart_InterComm_RxIntHandler(void)
{
if ((UART_InterComm_GetRxInterruptSourceMasked() & UART_InterComm_INTR_RX_NOT_EMPTY) != 0)
{
InterCommSerialStruct.InterCommRxBuffer[InterCommSerialStruct.InterCommRxWritePtr] = (unsigned char)UART_InterComm_UartGetByte();
InterCommSerialStruct.InterCommRxWritePtr++;
if(InterCommSerialStruct.InterCommRxWritePtr > INTERCOMMBUFFERSIZE)
InterCommSerialStruct.InterCommRxWritePtr =0;
InterCommSerialStruct.InterCommRxDiffPtr++;
UART_InterComm_ClearRxInterruptSource(UART_InterComm_INTR_RX_NOT_EMPTY);
}
if ( (UART_InterComm_GetTxInterruptSourceMasked() & UART_InterComm_INTR_TX_NOT_FULL) != 0 ) // RX interrupt
{
if(InterCommSerialStruct.InterCommTxDiffPtr > 0)
{
UART_InterComm_UartPutChar(InterCommSerialStruct.InterCommTxBuffer[InterCommSerialStruct.InterCommTxReadPtr]);
InterCommSerialStruct.InterCommTxReadPtr++;
if(InterCommSerialStruct.InterCommTxReadPtr >= INTERCOMMBUFFERSIZE )
{
InterCommSerialStruct.InterCommTxReadPtr = 0;
}
InterCommSerialStruct.InterCommTxDiffPtr--;
if(InterCommSerialStruct.InterCommTxDiffPtr == 0)
{
//serialIntOff; // Disable transmitter interrupt
UART_InterComm_SetTxInterrupt(0- UART_InterComm_INTR_TX_NOT_FULL);
}
UART_InterComm_ClearTxInterruptSource(UART_InterComm_INTR_TX_NOT_FULL); // clear interrupt
}
else
{
UART_InterComm_SetTxInterrupt(0-UART_InterComm_INTR_TX_NOT_FULL);
UART_InterComm_ClearTxInterruptSource(UART_InterComm_INTR_TX_NOT_FULL); // clear interrupt
}
//if ( tailTX == headTX ) // Check if all data is transmitted
}
}
/////////////////////////////////////////
txBuffer filling function
void SendPrinterUartData(unsigned char * PrinterData,unsigned char Len)
{
unsigned char i=0;
while(i<Len)
{
InterCommSerialStruct.InterCommTxBuffer[InterCommSerialStruct.InterCommTxWritePtr]= PrinterData;
InterCommSerialStruct.InterCommTxWritePtr++;
if(InterCommSerialStruct.InterCommTxWritePtr >= INTERCOMMBUFFERSIZE )
{
InterCommSerialStruct.InterCommTxWritePtr = 0;
}
InterCommSerialStruct.InterCommTxDiffPtr++;
i++;
}
UART_InterComm_SetTxInterrupt(UART_InterComm_INTR_TX_NOT_FULL);
}
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks motto tanaka for your reply.I understand my problem.I reduced INTERCOMMBUFFERSIZE to 50 because of ram size limitation .I forgot to increase that and trying to send more than 100 bytes at a time.
regards,Santosh pawar
|
|
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Would be easier to help you when you post your complete project or a shortened version that shows the error so that we all can have a look at all of your settings. To do so, use
Creator->File->Create Workspace Bundle (minimal)
and attach the resulting file.
Bob
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I have attached code and image.
I want software controlled uart transmit interrupt handler.
whenever transmit buffer empty transmit interrupt should be disabled and it should be enabled again only after atleast one byte in transmit buffer.
but in this code transmit interrupt is continuous.
Please help me to resolve this issue.
Regards,
Santosh Pawar
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Off the bat I see that under UART Advanced tab, you haven't checked the Interrupt Source for "RX FIFO Not empty" though you a interrupt handler defined for it. Please do that and check if it works until I debug your project further.
Regards,
Dheeraj
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have don't have any issue while receiving data,my problem is with transmission.
Regards,Santosh
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Santhosh,
When you call any function after UART_InterComm_Start() it will not execute any other functions like PrinterTest() in your case because the the control is now in the Uart_InterComm_RxIntHandler(void) and the interrupt UART_InterComm_INTR_TX_NOT_FULL is always true and hence you keep generating the interrupt and clearing it in the else loop as the condition InterCommSerialStruct.InterCommTxDiffPtr > 0 is also never true. This keeps occurring in a loop.
Hence, I just added PrinterTest() before calling UART_InterComm_Start() to load the tx buffer. You can see the ASCII equivalent of 0XAA being printed as shown below:
I have attached the cleaned project below for your reference, please change it to your appropriate device using the device selector. Hope this answers your query
Regards,
Dheeraj
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
In your SendPrinterUartData(), you are managing ring buffer read pointer, but you are not checking the overflow of the ring buffer.
So you may need to check if InterCommSerialStruct.InterCommTxDiffPtr is less or equal to INTERCOMMBUFFERSIZE.
But I don't think above issue can be the immediate reason of your current problem,
which is you have problem when sending tx data whose size is greater than 8 bytes.
I would check
If UART_InterComm_UartPutChar() is actually called, when sending tx data larger than 8.
If InterCommSerialStruct.InterCommTxReadPtr is within the range of INTERCOMMBUFFERSIZE.
If the value of the argument of UART_InterComm_UartPutChar() in the Uart_InterComm_RxIntHandler() is valid.
moto
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I've just downloaded your project and re-targeted the device to CY8C4247AZI-M485
so that I can debug it with my CY8CKIT-044.
To test the project I modified
(1) PrintTest
from > memset(PrinterUartBuff,0xAA,sizeof(PrinterUartBuff));
to < memset(PrinterUartBuff,'a',sizeof(PrinterUartBuff));
so that I can see the data in my terminal emulator (TeraTerm)
(2) main
un-commented the line PrinterTest()
from > // PrinterTest() ;
to < PrinterTest() ;
The result was flood of 'a's, although 100 of 'a's were expected.
Then I modified and added
while (InterCommSerialStruct.InterCommTxDiffPtr >= INTERCOMMBUFFERSIZE)
;
after
InterCommSerialStruct.InterCommTxDiffPtr++;
in void SendPrinterUartData(unsigned char * PrinterData,unsigned char Len)
so the function is now
=====================
void SendPrinterUartData(unsigned char * PrinterData,unsigned char Len)
{
unsigned char i=0;
while(i<Len)
{
InterCommSerialStruct.InterCommTxBuffer[InterCommSerialStruct.InterCommTxWritePtr]= PrinterData;
InterCommSerialStruct.InterCommTxWritePtr++;
if(InterCommSerialStruct.InterCommTxWritePtr >= INTERCOMMBUFFERSIZE )
{
InterCommSerialStruct.InterCommTxWritePtr = 0;
}
InterCommSerialStruct.InterCommTxDiffPtr++;
while (InterCommSerialStruct.InterCommTxDiffPtr >= INTERCOMMBUFFERSIZE) // <---- added
; // <---- added
i++;
}
UART_InterComm_SetTxInterrupt(UART_InterComm_INTR_TX_NOT_FULL);
}
=====================
The result was
better?
moto
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks motto tanaka for your reply.I understand my problem.I reduced INTERCOMMBUFFERSIZE to 50 because of ram size limitation .I forgot to increase that and trying to send more than 100 bytes at a time.
regards,Santosh pawar
|
|