Современная электроника №9/2018

ИНЖЕНЕРНЫЕ РЕШЕНИЯ 59 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 9 2018 ветствии с рисунком 7, уделив особое внимание параметрам, выделенным красным. Для настройки работы интерфей- са SPI необходимо нажать кнопку SPI0 (см. рис. 6) и в открывшемся справа окне выбрать параметры SPI, уделив особое внимание параметрам, выде- ленным красным (см. рис. 8). Затем в этом окне следует выбрать вклад- ку FIFO и в открывшемся справа окне установить параметры в соответствии с рисунком 9. Далее следует разрешить работу SPI в матрице соединений, для чего в правом верхнем углу меню нуж- но нажать на «решётку» (CROSSBAR0) и в открывшемся справа окне (см. рис. 10) выбрать пункт Clock/Data. В этом слу- чае порты (SPI) P1.2…P1.5 будут отме- чены синим цветом. Далее необходимо настроить рабо- ту портов LB12. Для этого в ниж- ней части меню следует переклю- чить режим, нажав кнопку Default Mode Port I/O. На экране будет ото- бражён рисунок микросхемы LB12 с её портами (см. рис. 11). С помо- щью команды Skip необходимо «пере- двинуть» сигналы SPI (SPI0_SCK, SPI0_MISO, SPI0_MOSI и SPI0_NSS) в пра- вую часть микросхемы. Далее следует установить для портов P1.2 (SPI0_SCK), P1.4 (SPI0_MOSI) и P1.5 (SPI_NSS) режим Digital Push-Pull Output, для порта P1.3 (SPI0_MISO) – Digital OpenDrain I/O, для порта P0.3 (EXTCLK) – Digital OpenDrain I/O, для портов P0.0 (VREF), P0.1 (AGND) и P2.5 (ADC_IN) – Analog I/O. После выполнения всех перечис- ленных операций сконфигурирован- ный режим работы устройства сле- дует записать на диск, в результате чего будет сгенерирован файл InitDevice.c. Рассмотрим подробнее подпрограм- мы приёма/передачи по интерфейсу SPI, т.к. при их написании и исполь- зовании был обнаружен ряд про- блем. В описании микроконтролле- ра EFM8LB12 указано, что в SPI добав- лен новый режим FIFO глубиной до 4 байт. При применении режима FIFO, вместо стандартных процедур ввода/ вывода по SPI и, в частности, исполь- зования флага SPIF (SPI0CN0_SPIF) для контроля ввода/вывода байта, должны применяться специальные процедуры. Вместе с тем в описании сказано, что если не использовать FIFO, то должны применяться стандартные процеду- ры ввода/вывода по SPI и, в частности, должен использоваться флаг SPIF для контроля приёма/передачи. При этом отмечается, что после команды сбро- са флага SPIF (SPI0CN0_SPIF=0;) для её гарантированного выполнения дол- жен пройти как минимум один машин- ный цикл. Один машинный цикл может быть задан, например, командой _nop_ () (пустая операция). Тогда, в соответ- ствии с описанием, если не использо- вать FIFO, его необходимо запретить, т.е. в строке Enable Recive FIFO устано- вить опцию Disabled вместо Enabled (см. рис. 9). Кроме того, в стандарт- ных подпрограммах вывода байта (см. листинг 1) и ввода байта (см. лис- тинг 2) после команды сброса фла- га SPIF необходимо ввести оператор _nop_(). Однако в такой конфигура- ции обмен по SPI работать не будет. Если же разрешить FIFO, то обмен дан- ными заработает, но первые несколь- ко байт будут прочитаны неправильно. Не помогает и многократное включе- ние команды _nop_(). Проблема может быть решена, если после команды сбро- са флага SPIF обратиться к подпрограм- ме задержки DEL20NS() (см. листинг 3), представляющей собой два пустых цик- ла ( for (i = 0; i < 2; i++) {} ) при использовании генератора на 72 МГц. При использовании генера- тора на 50 МГц количество пустых циклов можно уменьшить до одного ( for (i = 0; i < 1; i++) {} ). Р ЕЗУЛЬТАТЫ Результаты работы программы изме- рений напряжений при N =1, 2, 4, 8, 16 и 32 приведены в дополнительных мате- риалах к статье на сайте www.soel.ru. На рисунке 12 представлены результа- ты измерений при N =4. Как видно из рисунка, 5-й знак после запятой изме- няется от 4 до 7. Листинг 2 //------------------------------- unsigned char inspi() { //------------------------------- unsigned char byte; SPI0DAT = 0x0f; // Ввод байта в микрокон- троллер while (!SPI0CN0_SPIF); // Ожидание окончания ввода байта SPI0CN0_SPIF = 0; // Сброс флага окончания приёма byte = SPI0DAT; DEL20NS(); // Задержка для гарантированного сброса флага SPIF. return (byte); } //------------------------------ Листинг 3 //------------------------------ void DEL20NS() { // _nop_(); unsigned char i; for (i = 0; i < 2; i++) {} } //------------------------------- Листинг 1 //-------------------------------- void outspi(unsigned char byte) { //-------------------------------- SPI0DAT = byte; // Вывод байта по SPI while (!SPI0CN0_SPIF); // Ожидание окончания вывода байта SPI0CN0_SPIF = 0; // Сброс флага окончания передачи DEL20NS(); // Задержка для гарантированного сброса флага SPIF } //------------------------------- Рис. 11. Порты LB12 Рис. 12. Окно программы с результатами при N =4 AGND VREF ADC_IN SPI0_SCK SPI0_MISO SPI0_MOSI SPI0_NSS EXTCLK C2D RST/C2CK

RkJQdWJsaXNoZXIy MTQ4NjUy