сначала пакеты отправлял по udp, но не был уверен что все доходят, сейчас пока отправляю по TCP.
передача без ошибок, если SSC гоняет на 1МГц, если увеличить, то пропадают пакеты. MCLK = 86МГц.
знатоки, подскажите, можно ли ускорить весь этот процесс?
код:
CODE
void SSC_ReInit( void )
{
unsigned int SLOT_BY_FRAME = 1;
unsigned int BITS_BY_SLOT = 16;
pSSC->SSC_CR = AT91C_SSC_SWRST;
pSSC->SSC_CMR = 40;
*AT91C_SSC_TFMR = (AT91C_SSC_FSOS_POSITIVE |
(((SLOT_BY_FRAME-1)<<8) & AT91C_SSC_DATNB) |
AT91C_SSC_MSBF | (BITS_BY_SLOT-1));
*AT91C_SSC_RFMR = (AT91C_SSC_FSOS_POSITIVE |
(((SLOT_BY_FRAME-1)<<8) & AT91C_SSC_DATNB) | //AT91C_SSC_LOOP |
AT91C_SSC_MSBF | (BITS_BY_SLOT-1));
*AT91C_SSC_TCMR = (((((BITS_BY_SLOT*SLOT_BY_FRAME)/2) -1) <<24) |
AT91C_SSC_START_FALL_RF |
AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_CKI | AT91C_SSC_CKS_DIV);
*AT91C_SSC_RCMR = (((((BITS_BY_SLOT*SLOT_BY_FRAME)/2) -1) <<24) |
AT91C_SSC_START_FALL_RF |
AT91C_SSC_CKO_CONTINOUS| AT91C_SSC_CKS_DIV);
}
-----------------------------------------------------------------
void BSP_SSC_Init( void )
{
// Init buffers
buffersRX[0] = &pBufferRX1[0];
buffersRX[1] = &pBufferRX2[0];
buffersRX[2] = &pBufferRX3[0];
buffersRX[3] = &pBufferRX4[0];
AT91F_SSC_CfgPIO();
AT91F_SSC_CfgPMC();
pSSC->SSC_IER = ( unsigned int )0x00;
pSSC->SSC_IDR = ( unsigned int )0xffff;
SSC_ReInit();
old_buff = 0;
next_buff = 1;
pSSC->SSC_RPR = (AT91_REG)buffersRX[0];
pSSC->SSC_RCR = SSCBUFSIZE;
pSSC->SSC_RNPR = (AT91_REG)buffersRX[1];
pSSC->SSC_RNCR = SSCBUFSIZE;
pAIC->AIC_IDCR = (1<<AT91C_ID_SSC);
pAIC->AIC_SVR[AT91C_ID_SSC] = (unsigned int)SscHandler;
pAIC->AIC_SMR[AT91C_ID_SSC] = (AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL|0x4);
pAIC->AIC_IECR = (1<<AT91C_ID_SSC);
pSSC->SSC_IER = /*AT91C_SSC_ENDTX|*/AT91C_SSC_ENDRX;
pSSC->SSC_IDR = ~(/*AT91C_SSC_ENDTX|*/AT91C_SSC_ENDRX);
pSSC->SSC_PTCR = /*AT91C_PDC_TXTEN|*/AT91C_PDC_RXTEN;
pSSC->SSC_CR = /*AT91C_SSC_TXEN|*/AT91C_SSC_RXEN;
}
-----------------------------------------------------------------
void SscHandler(void)
{
INT8U err;
INT8U flg;
unsigned long STATUS = AT91C_BASE_SSC->SSC_SR;
if ((STATUS & AT91C_SSC_ENDRX) == AT91C_SSC_ENDRX)
{
pSSC->SSC_IER = /*AT91C_SSC_ENDTX|*/AT91C_SSC_ENDRX;
OSQPost(CommQ, (void *)buffersRX[old_buff]);
old_buff = next_buff;
next_buff++;
if (next_buff == SSCBUFCOL) next_buff = 0;
pSSC->SSC_RNPR = (AT91_REG)buffersRX[next_buff];
pSSC->SSC_RNCR = SSCBUFSIZE;
}
if ((STATUS & AT91C_SSC_ENDTX) == AT91C_SSC_ENDTX)
{
pSSC->SSC_IER = AT91C_SSC_ENDTX;
pSSC->SSC_TNPR = (AT91_REG)pBufferTX1;
pSSC->SSC_TNCR = SSCBUFSIZE;
}
AT91C_BASE_AIC->AIC_IVR = 0;
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_SSC);
}
------------------------------------------------
static void App_TaskUserIF (void *p_arg)
{
NET_SOCK_ID sock, sock_cl;
struct sockaddr_in client;
INT8U errMbox;
CPU_INT16U* pbuf;
// Init TCP/IP structures
client.sin_family = AF_INET;
client.sin_port = htons(11001);
client.sin_addr.s_addr = htonl(INADDR_ANY);
// Create socket
sock = socket(AF_INET, SOCK_STREAM, 0);
bind((int) sock,(struct sockaddr *)&client, (socklen_t)(sizeof (struct sockaddr_in)));
listen (sock,3);
sock_cl = accept (sock,(struct sockaddr *)&client, (socklen_t*)&errMbox);
// Init SSC
BSP_SSC_Init();
while(1)
{
pbuf = (CPU_INT16U*)OSQPend(CommQ, 0, &errMbox);
send(sock_cl,pbuf,2048,0);
};
}
{
unsigned int SLOT_BY_FRAME = 1;
unsigned int BITS_BY_SLOT = 16;
pSSC->SSC_CR = AT91C_SSC_SWRST;
pSSC->SSC_CMR = 40;
*AT91C_SSC_TFMR = (AT91C_SSC_FSOS_POSITIVE |
(((SLOT_BY_FRAME-1)<<8) & AT91C_SSC_DATNB) |
AT91C_SSC_MSBF | (BITS_BY_SLOT-1));
*AT91C_SSC_RFMR = (AT91C_SSC_FSOS_POSITIVE |
(((SLOT_BY_FRAME-1)<<8) & AT91C_SSC_DATNB) | //AT91C_SSC_LOOP |
AT91C_SSC_MSBF | (BITS_BY_SLOT-1));
*AT91C_SSC_TCMR = (((((BITS_BY_SLOT*SLOT_BY_FRAME)/2) -1) <<24) |
AT91C_SSC_START_FALL_RF |
AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_CKI | AT91C_SSC_CKS_DIV);
*AT91C_SSC_RCMR = (((((BITS_BY_SLOT*SLOT_BY_FRAME)/2) -1) <<24) |
AT91C_SSC_START_FALL_RF |
AT91C_SSC_CKO_CONTINOUS| AT91C_SSC_CKS_DIV);
}
-----------------------------------------------------------------
void BSP_SSC_Init( void )
{
// Init buffers
buffersRX[0] = &pBufferRX1[0];
buffersRX[1] = &pBufferRX2[0];
buffersRX[2] = &pBufferRX3[0];
buffersRX[3] = &pBufferRX4[0];
AT91F_SSC_CfgPIO();
AT91F_SSC_CfgPMC();
pSSC->SSC_IER = ( unsigned int )0x00;
pSSC->SSC_IDR = ( unsigned int )0xffff;
SSC_ReInit();
old_buff = 0;
next_buff = 1;
pSSC->SSC_RPR = (AT91_REG)buffersRX[0];
pSSC->SSC_RCR = SSCBUFSIZE;
pSSC->SSC_RNPR = (AT91_REG)buffersRX[1];
pSSC->SSC_RNCR = SSCBUFSIZE;
pAIC->AIC_IDCR = (1<<AT91C_ID_SSC);
pAIC->AIC_SVR[AT91C_ID_SSC] = (unsigned int)SscHandler;
pAIC->AIC_SMR[AT91C_ID_SSC] = (AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL|0x4);
pAIC->AIC_IECR = (1<<AT91C_ID_SSC);
pSSC->SSC_IER = /*AT91C_SSC_ENDTX|*/AT91C_SSC_ENDRX;
pSSC->SSC_IDR = ~(/*AT91C_SSC_ENDTX|*/AT91C_SSC_ENDRX);
pSSC->SSC_PTCR = /*AT91C_PDC_TXTEN|*/AT91C_PDC_RXTEN;
pSSC->SSC_CR = /*AT91C_SSC_TXEN|*/AT91C_SSC_RXEN;
}
-----------------------------------------------------------------
void SscHandler(void)
{
INT8U err;
INT8U flg;
unsigned long STATUS = AT91C_BASE_SSC->SSC_SR;
if ((STATUS & AT91C_SSC_ENDRX) == AT91C_SSC_ENDRX)
{
pSSC->SSC_IER = /*AT91C_SSC_ENDTX|*/AT91C_SSC_ENDRX;
OSQPost(CommQ, (void *)buffersRX[old_buff]);
old_buff = next_buff;
next_buff++;
if (next_buff == SSCBUFCOL) next_buff = 0;
pSSC->SSC_RNPR = (AT91_REG)buffersRX[next_buff];
pSSC->SSC_RNCR = SSCBUFSIZE;
}
if ((STATUS & AT91C_SSC_ENDTX) == AT91C_SSC_ENDTX)
{
pSSC->SSC_IER = AT91C_SSC_ENDTX;
pSSC->SSC_TNPR = (AT91_REG)pBufferTX1;
pSSC->SSC_TNCR = SSCBUFSIZE;
}
AT91C_BASE_AIC->AIC_IVR = 0;
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_SSC);
}
------------------------------------------------
static void App_TaskUserIF (void *p_arg)
{
NET_SOCK_ID sock, sock_cl;
struct sockaddr_in client;
INT8U errMbox;
CPU_INT16U* pbuf;
// Init TCP/IP structures
client.sin_family = AF_INET;
client.sin_port = htons(11001);
client.sin_addr.s_addr = htonl(INADDR_ANY);
// Create socket
sock = socket(AF_INET, SOCK_STREAM, 0);
bind((int) sock,(struct sockaddr *)&client, (socklen_t)(sizeof (struct sockaddr_in)));
listen (sock,3);
sock_cl = accept (sock,(struct sockaddr *)&client, (socklen_t*)&errMbox);
// Init SSC
BSP_SSC_Init();
while(1)
{
pbuf = (CPU_INT16U*)OSQPend(CommQ, 0, &errMbox);
send(sock_cl,pbuf,2048,0);
};
}