Чтение байта данных в I2C EEPROM по произвольному адресу осуществляется путем вызова функции rd_byte24LC64(addr_I2C). В отличие от предыдущего случая, эта функция возвращает управление только после окончания чтения, детектируя это событие по текущему значению переменной endjrd (признак окончания чтения), которую она сбрасывает перед началом чтения, а затем ожидает ее установки. Признак окончания чтения endjrd устанавливается функцией I2CInterrupt() после передачи логической схемой интерфейса 12С LPC2129 условия STOP 12С.
33.9. Интерфейс обмена с внешним устройством через SPI
Модуль последовательного периферийного интерфейса SPI микроконтроллера LPC2000 в предлагаемом ниже проекте используется для обмена данными с внешним устройством, в качестве которого выступает микросхема AD7705 производства фирмы «Analog Devices* [14]. Микросхема AD7705 представляет собой 2-канальное сигма-дельта-АЦП с встроенными модулями SPI, входного аналогового буфера, программируемого усилителя, тактового генератора и регистрового банка контроля и управления.
Взаимодействие микроконтроллера LPC2000 с AD7705 через SPI иллюстрируется проектом, все файлы которого находятся в каталоге SPI. Функции и заголовки, относящиеся к модулю SPIO LPC2129, содержатся в файлах spi.c и spi.h. Функции и заголовки, относящиеся к организации обмена через SPI с AD7705 и к функционированию самой этой микросхемы, содержатся в файлах AD7705.C и AD7705M. Основная программа, реализующая проект, содержится в файле main.c. Все перечисленные файлы приведены ниже в этом разделе.
Файл spi.c
//------------------------------------------------------------------------
//ПО обслуживания модуля SPIO
//------------------------------------------------------------------------
tinclude "hardware.h" //подключение специальных заголовков и определений
tinclude "spi.h" //подключение специальных заголовков и определений
volatile U8 rx_byte; //принятый через SPIO байт
//Функция инициализации модуля SPIO
void SPlOinitO
{
PINSELO_bit.Р0_4 = 0x01; //линию Р0.4 сделать выходом SCK SPI0 PINSEL0_bit.Р0_5 = 0x01; //линию РО.5 сделать входом MISO SPIO PINSEL0_bit.P0_6 = 0x01; //линию Р0.6 сделать выходом MOSI SPIO PINSEL0_bit.P0_7 = 0x01; //линию Р0.7 сделать входом SSEL SPIO SOSPCCR_bit.COUNTER = 40; //задание длительности цикла SPI в циклах PCLK
S0SPCR_bit.CPHA S0SPCR_bit.CPOL S0SPCR_bit.MSTR S0SPCR_bit.LSBF S0SPCR_bit.SPIE
1 1
1 0 0
//58.9824 МГц/4/40 = 0.36864 МГц //СРНА = 1 //CPOL = 1
//режим SPIO - мастер
//первым передается MSB (старший значащий бит) //прерывания от SPI0 запрещены
//Функция передачи байта и приема байта через SPI0 U8 SPl0rx_tx_byte(U8 tx_byte)
while (S0SPSR_bit.SPIF rx_byte = SOSPDR; return rx_byte;
0);
//
Файл spi.h
//----------------------------------------•-------------------------------
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |