|
Тихоходный SPI на SAM7 |
|
|
|
Nov 23 2009, 21:03
|

Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669

|
Цитата(prottoss @ Nov 21 2009, 17:29)  Частота может быть в широком диапазоне. Я указал нижнюю границу. Потому что слэйв порой не успевает  Если Slave не успевает, то попробуйте его сделать мастером а Master - Slave-ом и используйте его SPI. Часто помогает.
--------------------
Вяжешь - вой, а поедешь - песни пой. Между "хочу" и "можно" всегда есть дистанция
|
|
|
|
|
Nov 24 2009, 06:42
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Petka @ Nov 21 2009, 22:05)  Слэйв программный что-ли? Аппаратный Цитата(IJAR @ Nov 24 2009, 04:03)  Если Slave не успевает, то попробуйте его сделать мастером а Master - Slave-оми используйте его SPI. Часто помогает. Его невозможно сделать мастером Цитата(aaarrr @ Nov 24 2009, 04:12)  А это чему-то мешает? Используйте "ногодрыганье" в нижнем диапазоне и аппаратный SPI в верхнем. Все лучше, чем тиранить железку пятьюдесятью герцами. Я все таки склонился к варианты с двумя счетчиками и SPI в режиме Slave. Т.е. одним счетчиком задаем период, вторым количество тактовых импульсов SPI. Да и вообще меня больше привлекает динамичный железный SPI, нежели ногодрыгание.
--------------------
|
|
|
|
|
Jan 3 2010, 15:19
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Всех с прошедшим Новым Годом и наступающим Рождеством! Все у меня получилось с тихоходным SPI. Сделал два счетчика - первый для формирования импульса , второй для счета этих самых импульсов. Счетный вход второго счетчика соответсвенно соединен с выходом TIOA первого. Останавливал оба счетчика в прерывании по "COMPARE А" второго. . Решил избавиться от прерывания. Для этого выход TIOA запрограммировал на соединение со счетным входом первого через мультиплексор по AND (флаг Burst Signal Selection). Но что то не пашет... Вот код инициализации: Код /* Init SCK WAVE maker counter */ TC_Init(AT91C_BASE_TC2, AT91C_ID_TC2, 0 | /* Source clock - none */ AT91C_TC_BURST_XC2 | /* Clock from XCLK & control signal (HI) from PULSE TIOA */ AT91C_TC_WAVESEL_UP_AUTO | /* UP mode with atomatic trigger on RC Compare */ AT91C_TC_WAVE | /* Waveform Mode is enabled */ AT91C_TC_ACPA_SET | /* A Compare Effect on TIOA - Set output pin after compare */ AT91C_TC_ACPC_CLEAR /* C Compare Effect on TIOA - Clear output pin after compare */ ); AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN; /* Enable clock */ /* Init SCK PULSE counter */ TC_Init(AT91C_BASE_TC1, AT91C_ID_TC1, AT91C_TC_CLKS_XC1 | /* Clock from WAVE TIOA */ AT91C_TC_CLKI | /* Invert clock - for negative edge counting */ AT91C_TC_WAVESEL_UP_AUTO | /* UP mode with atomatic trigger on RC Compare */ AT91C_TC_WAVE | /* Waveform Mode is enabled */ AT91C_TC_ACPA_CLEAR | /* Clear TIOA after compare - for stopping Wave Counter */ AT91C_TC_ASWTRG_SET /* Set TIOA after starting - for start Wave Counter */ ); AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN; /* Enable clock */
/* Set counters block register */ AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC2XC2S_TIOA1 | AT91C_TCB_TC1XC1S_TIOA2 | AT91C_TCB_TC0XC0S_NONE; Старт счетчиков: Код /* Enable clock and start pulse counter */ AT91C_BASE_TC1->TC_RA = (UINT32)n_pulses; /* Setup pulse counter compare */ (void)AT91C_BASE_TC1->TC_SR; /* Clear status register */ AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; /* !!!!!!!!!!!!!!!!!!!!! Here TIOA must be set to one, for enable clock for Wave Maker !!!!!!!!!!!!!!!!!!!!! */ /* Enable clock and start wave maker */ (void)AT91C_BASE_TC2->TC_SR; /* Clear status register */ AT91C_BASE_TC2->TC_CCR = AT91C_TC_SWTRG; В окне отладчика вижу, что после команды "AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG" MTIOA в регистре статуса не устанавливается в "1", тем самым не разрешает счет для ТС2. Но не могу понять почему...
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|