Пытаюсь активировать аппаратный 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 я считываю отправленный байт.
Что-ж, можно дальше программить...
Проц - 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 я считываю отправленный байт.
Что-ж, можно дальше программить...