СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №2/2012
дый. Таким образом, если определён массив, например, INARRAY[64] раз мером в 64 байта, то для того чтобы в этот массив записалась инфор мация, поступившая по USB, тре буется следующая запись: Block_ Read((BYTE*)&INARRAY, 64); ● Block_Write (BYTE *Buffer, NumBytes) – это функция с параметрами, пред назначенная для передачи инфор мации из микроконтроллера в ин терфейс USB. Первый параметр Buffer – название массива информа ции, предназначенной для переда чи; символ * означает адрес массива. Второй параметр NumBytes – коли чество байтов, которые требуется пе редать. Его максимальное значение равно 4 Кб (4096 байтов), т.е. переда ча информации из МК по USB осу ществляется пакетами с максималь ным объёмом в 4096 байтов каждый. Таким образом, если определён мас сив, например, INARRAY[1024] разме ром в 1024 байта, то для его передачи по USB требуется запись: Block_Write((BYTE*)&INARRAY,1024) Cимвол ‘&’ перед названиеммассива INARRAY означает, что обращение к массиву производится по адресу. В отличие от программ для компью тера, приём и передача информации в микроконтроллере организованы с помощью прерываний, источни ки которых описаны в приложении AN169.pdf. Обязательными для исполь зования, по мнению автора, являются только три: ● RX_Complete – это прерывание воз никает, когда в буфер приёмника USB поступит информация и данные можно считать функцией Block_ Write(); ● TX_Complete – это прерывание воз никает, когда данные, записанные с помощью функции Block_Write(), полностью переданы по USB в ком пьютер; ● Device_Close – это прерывание воз никает, когда интерфейс USB закры вается со стороныкомпьютерафунк цией SI_Close(Handler), о которой рассказывалось выше. На сайте журнала приведён фраг мент программы, которая предназна чена для приёма микроконтроллером C8051F321 массива размером в 4 Кб, переданным компьютером, передачи и приёма этогомассива по интерфейсу SPI в/из микроконтроллера C8051F067 и передачимассива обратно в компью тер. Этот фрагмент является основным в программе, полный текст которой также приведён на сайте журнала. Фрагмент фактически состоит из двух подпрограмм. Первая подпро грамма State_Machine() определяет, что необходимо сделать с информацией в зависимости от состоянияМК, а вторая подпрограмма USB_API_Test_ISR() об рабатывает прерывания, возникающие в интерфейсе USB. Еслирассмотретьподпрограммуобра ботки прерываний USB_API_TEST_ISR(), то можно заметить, что в ней использу ются три прерывания: TX_Complete, RX_Complete и Device_Close, два из ко торых (TX_Complete и RX_Complete) обрабатываются программой State_Ma chine(), а третье (Device_Close) этой программой не обрабатывается. Мож но сделать вывод, что это прерывание не требуется (т.к. не определено, что требуется сделать, если оно возника ет), и состояние M_State = ST_Wait_DEV вообще не рассматривать. Однако это приведёт к тому, что программа обме на по USB в компьютере запустится только один раз, а при повторном за пуске «зависнет». В связи с этим непо нятно, что происходит с микрокон троллером, когдаM_State = ST_Wait_DEV, и как библиотекаUSBXpress использует это состояние. Вофрагменте программы, приведён ном выше, обмен по SPI описан между двумя строками, состоящими из звез дочек (*), т.е. от закомментированного оператора // goto AAA; до метки //AAA:. Если убрать комментарии перед этим оператором (и перед тремя предыду щими) и меткой, то обмен по SPI будет пропущен и принятые из компьютера данные, минуя интерфейс SPI, будут сразу передаваться в компьютер. Этот режим работы USB удобно использо вать при оценке скорости обмена по USB или при других обстоятельствах, когда обмен по SPI не требуется. В та ком режиме, например, работает уст ройство, подключенное к компьютеру, как показано на рисунке 16а. Особенности программ, связанных с интерфейсом SPI В обмене по SPI в вышеприведённом фрагменте присутствует подпрограм ма HSSPI(), текст которой приведён ниже. void HSSPI (void) { while(!MOSI); //только для режима 3 wire. В режиме 4 wire while(MOSI); //синхронизация не обязательна, //но хуже не будет. // SPIEN=1; outspi(0x40); } Эта подпрограмма предназначена для синхронизации начала обмена по SPI ведомого микроконтроллера с ве дущим в трёхпроводном режиме. Дело в том, что в трёхпроводном режиме момент начала обмена по SPI между ведомымМК и ведущимМК не опреде лён, т.к. отсутствует определяющий сигнал NSS. В результате может сло житься ситуация, когда ведущий МК пытается ввести байт, посылаемый ве домымМК, но из за того, что ведомому неизвестен момент начала чтения бай та ведущим, посылка байта ведомым МК может начаться не с начала чтения байта ведущимМК, а, например, после четвёртого стробирующего импульсa SCK. Это приведёт к тому, что, во пер вых, ведущийМК прочитает неверный результат и, во вторых, ведомый МК, выведя 4 бита, будет ожидать ещё че тыре импульса SCK, и, пока они не поступят, вывод остальных 4 бит бу дет приостановлен. При повторной попытке чтения байта ведущим МК, первые четыре импульса SCK, посыла емые ведущим МК, продолжат вывод остальных 4 бит ведомым МК, в ре зультате чего ведущий МК опять полу чит неверный результат, и ситуация повторится. В результате либо обмен сорвётся, либо всё «зависнет». Чтобы такая ситуация не возникла, ведомый МК должен посылать байт именно в тот момент, когда ведущий МК начи нает чтение этого байта. Но как ведо мый МК может определить этот мо мент без сигнала NSS? Предположим, для начала обмена информацией ведущий микрокон троллер должен получить подтвержде ние от ведомого МК, – какой нибудь известный обоиммикроконтроллерам байт. Если такой байт получен веду щим МК, то для него это будет озна чать, что ведомыйМК готов передавать информацию. Пусть, для примера, зна чение такого байта будет равно 0 × 40 (символ ‘@’). Как известно, для ввода или вывода байта по SPI требуется записать ин формацию в регистр SPI0DAT. Если ве ПРАКТИЧЕСКАЯ ЭЛЕКТРОНИКА 42 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 2 2012 © СТА-ПРЕСС
RkJQdWJsaXNoZXIy MTQ4NjUy