Пытаюсь активировать аппаратный SPI, наткнулся на то, что не могу понять.
Проц - 16F1825. При конфигурировании настроил самотактирование 32МГц, 2 таймера, один для УАРТа другой для постоянного мигания диодом, активировал УАРТ, с работоспособностью которого проблем нет. В этом проце предусмотрено конфигурирование пинов под uart и spi - этот регистр тоже настроил вроде правильно. Решил в отладочных целях применить практику отправки по команде из УАРТа регистров конфигурации и состояния - в зависимости от ситуации. Настройка регистров SPI как будто тоже правильная.
Задача стоит завести обмен по SPI с микрухой WIZNET5100(как разберусь с интерфейсом). Поскольку запускаю SPI впервые, сначала хотелось проверить правильность настроек путям снятия импульсов с осцила. Тут все работает - с MOSI и MCK снимаются и сами передаваемые биты и синхронизация.
Решил проверить MISO. Предположил, что если его подтянуть к плюсу или земле через резистор 2К то я смогу при чтении снять соответственно 0х00 или 0xFF. По крайней мере это логичное предположение.
Делаю следующим образом:
1.Подтягиваю MISO к желаемой точке (+ или земля) 2.Даю в УАРТ команду, по которой происходит следующее:
temp=SSP1BUF; //холостое чтение - очистка бита BF на всякий случай. SSP1BUF = RcvBuffer[0]; //пишу в SPI байт данных while (!(SSP1STAT & 0x01)); //Жду пока выставится бит BF SendBuffer[0]=0xF0; //отправляю флаг того, что выполняется данный блок кода SendBuffer[2]=SSP1STAT; //цель - обнаружить бит BF SendBuffer[1]=SSP1BUF; //читаю буфер SPI SendBuffer[3]=SSP1CON1; SendBuffer[4]=SSP1STAT; //По идее - после чтения буфера бит BF должен сброситься.
/////////Далее буфер SendBuffer отправляется в TX, и долетает до меня.
Т.е я получаю из УАРТа ответ, содержащий как принятые по SPI данные, так и регистры состояния SPI. Как и ожидалось, сначала я вижу бит BF, а после чтения из буфера - он сбрасывается. Так же в целом регистры SSP1STAT и SSP1CON1 соответствуют тому, что я прописал в коде.
Не могу понять главного - почему байт SendBuffer[1] всегда прилетает со значением 0х00? Т.е после передачи в SPI бит BF благополучно выставляется, но при чтении я всегда получаю пустой буфер. Вне зависимости от того, куда я подтянул MISO.
Подскажите куда думать... ощущение что пропустил что-то в конфигурации. TRISы стоят как указано в даташите.
Добавлено after 3 hours 53 seconds: Набрался терпения, крепкого кофе, и докурил даташит... Все просто было.
Регистр ANSELC вполне себе однозначно конфигурится. Даже при начисто отключеных АЦП и прочего, эти линии все равно следовало выставить как digital i/o
Теперь при подтяжке MISO к плюсу я снимаю 0xFF а к земле - 0х00. И даже более того - при перемычке между MISO и MOSI я считываю отправленный байт. Что-ж, можно дальше программить...
|