реклама на сайте
подробности

 
 
> SSC на AT91SAM7X256, какую скорость можно выжать???
mirr
сообщение Sep 10 2009, 13:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 10-09-09
Пользователь №: 52 279



Всем привет. у меня такая проблема: необходимо по SSC принимать данные от ПЛИС и отправлять их по Ethernet'y и это все на максимально возможной скорости. данные поступают порциями по 16 бит, передачу тактирует SSC.
сначала пакеты отправлял по 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);
};
}
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Sep 10 2009, 13:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mirr @ Sep 10 2009, 17:02) *
передача без ошибок, если SSC гоняет на 1МГц, если увеличить, то пропадают пакеты. MCLK = 86МГц.

Во-первых, SSC работает нормально до MCLK/2. Во-вторых, MCLK = 86MHz - это очень-очень далеко за предельными 55MHz, поэтому может вообще ничего не работать.
Go to the top of the page
 
+Quote Post
mirr
сообщение Sep 10 2009, 13:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 10-09-09
Пользователь №: 52 279



ну а может быть так, что TCP просто не успевает отправить данные за то время пока SSC принимает новые?
может у меня как-то прием не правильно организован?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 10 2009, 13:46
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mirr @ Sep 10 2009, 17:36) *
ну а может быть так, что TCP просто не успевает отправить данные за то время пока SSC принимает новые?

Ну так испытайте его производительность отдельно от SSC.

Цитата(mirr @ Sep 10 2009, 17:36) *
может у меня как-то прием не правильно организован?

На вид организован правильно, только SscHandler изобилует бессмысленными действиями:
Код
pSSC->SSC_IER = /*AT91C_SSC_ENDTX|*/AT91C_SSC_ENDRX;

pSSC->SSC_IER = AT91C_SSC_ENDTX;

AT91C_BASE_AIC->AIC_ICCR    =  (1 << AT91C_ID_SSC);

Вполне возможно, что где-то есть ошибки.
Go to the top of the page
 
+Quote Post
mirr
сообщение Sep 10 2009, 13:59
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 10-09-09
Пользователь №: 52 279



aaarrr, а Вам не приходилось разгонять SSC быстрее?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 10 2009, 14:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mirr @ Sep 10 2009, 17:59) *
aaarrr, а Вам не приходилось разгонять SSC быстрее?

Ну, я не ставил себе целью специально его разгонять, но вполне нормально работает в одном из устройств на 4.096MHz в слейве и 1.4112MHz в мастере. Может, где-то делал и быстрее - не помню. В любом случае, он способен работать вплоть до MCLK/2.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016