PIC24 SPI master отказывается принимать тактовые генераторы

У меня есть плата начального комплекта MPLAB с микросхемой PIC24FJ256GB106, обменивающаяся данными с подключенной платой ADXL375 чипа акселерометра (которая, по-видимому, не является причиной моей проблемы) через SPI в 3-проводном соединении SPI (SDO не используется). Я настроил периферийное устройство. Pin Select активирует модуль SPI1:

void MapSPIModulPins()
{
__builtin_write_OSCCONL(OSCCON&0xbf); //! PPSUnLock
RPOR1bits.RP3R = 8 ; //! Assign RP3 as Output Pin To SPI1 Clock Output.
RPOR2bits.RP4R = 7 ; //! Assign RP4 as Output Pin SPI1 Data Output.
//RPOR1bits.RP2R = 9 ; //! Assign RP2 as Output Pin Where is SPI1 Slave Select Output. SS1OUT
__builtin_write_OSCCONL(OSCCON|0x40);    //! PPSLock

//! Extra digital output as Chip Select
TRISDbits.TRISD8 = 0; // Thomas 18.11.2014
}

SPI настроен с:

void SPIsetup1ForMasterMode()
{
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag
IEC0bits.SPI1IE = 0; // Disable the interrupt

// SPI1CON1 Register Settings
SPI1STATbits.SPIEN  = 0; //! Thomas(THOMAHPS) 20.11.2014  Disable SPI module
SPI1CON1bits.DISSCK = 0; // Internal serial clock is enabled
SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module
SPI1CON1bits.MODE16 = 0;// Communication is byte-wide (8 bits) // Thomas 17.11.2014

SPI1CON1bits.MSTEN = 1; // Master mode enabled
SPI1CON1bits.SMP = 0; // Input data is sampled at the middle of data output time
SPI1CON1bits.CKE = 0; // Serial output data changes on transition from Idle clock state to active clock state

// Idle clock state to active clock state
SPI1CON1bits.CKP = 0; // Idle state for clock is a low level;

// active state is a high level
SPI1STATbits.SPIEN = 1; // Enable SPI module
SPI1STATbits.SPIROV = 0 ; //! Thomas 20.11.2014 Clear the SPIROV bit !

// Interrupt Controller Settings
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag
IEC0bits.SPI1IE = 1; // Enable the interrupt
}

ИМХО асимметричное поведение между передачей и приемом SPI не может быть установлено.

Обработчик прерываний:

void __attribute__((interrupt,no_auto_psv)) _SPI1Interrupt(void)
{
   IFS0bits.SPI1IF = 0;     //Clear Interrupt status of SPI1
}

Затем я передал байт данных с

SPI1BUF = anyBytePattern;

который я мог наблюдать на осциллографе вместе с часами. Получение данных может быть инициировано с помощью (я здесь опускаю проверки флагов состояния!)

unsigned int recvData = SPI1BUF;

Ни в одной операции, ни в бесконечном цикле на сигнальной линии НЕТ ЧАСОВ!

Я встроил свой код в соответствующие места демонстрационного приложения, что не должно мешать моей проблеме.
Я перепробовал много вещей с задержками, пример кода производителя, сообщества и т. Д.
В сеансах отладки не наблюдалось никаких необычных значений регистра (флаги ошибок SPI).
Разделение подчиненного электронного устройства не имеет значения в поведении.

Это проблема PPS?

Я наткнулся на описание SPI производителя.
В документе PIC24FJ256GB110 описан раздел 15.0 СЕРИЙНОГО ПЕРИФЕРИЧЕСКОГО ИНТЕРФЕЙСА (SPI).
"Последовательный интерфейс SPI состоит из четырех контактов:
SDIx: последовательный ввод данных
SDOx: последовательный вывод данных
SCKx: сдвиг тактового входа или выхода
SSx: активный-низкий ведомый выбор или импульс ввода-вывода синхронизации кадров
Модуль SPI может быть настроен на работу с использованием 2, 3 или 4 контактов. В 3-контактном режиме SSx не используется. В 2-контактном режиме SDOx и SSx не используются ".
В этом же документе была распиновка 64-контактного чипа PIC24FJ256GB106, который имеет только один сигнал данных SPI-данных под названием SDA1, физически расположенный на контакте № 43.
Как можно реализовать 3+ проводное решение SPI с этим чипом?

Я отобразил этот сигнал и тактовую частоту SPI с помощью команд PPS, как показано выше, обращаясь к ТАБЛИЦЕ 10-3: ВЫБИРАЕМЫЕ ИСТОЧНИКИ ВЫХОДА (ФУНКЦИЯ КАРТЫ НА ВЫХОД):
Функция SDO1 (выход данных SPI1) с кодом 7 и функция SCK1OUT (выход тактового сигнала SPI1) как 8.

Для связи с моим ведомым SPI требуется цикл записи-чтения, я сообщаю ему регистр nr, и он отвечает мне этим значением.
Достаточно ли этого сопоставления PPS для выполнения этой работы?

А как насчет отображения ввода?

В ТАБЛИЦЕ 10-2: ВЫБИРАЕМЫЕ ИСТОЧНИКИ ВВОДА (MAPS INPUT TO FUNCTION) - это строки с
Функции SCK1IN (вход тактового сигнала SPI1), регистр RPINR20, биты SCK1R(5:0)
и SDI1 (вход данных SPI1), регистр RPINR20, биты SDI1R(5:0)

Я добавил строки кода в MapSPIModulPins():

RPINR20bits.SCK1R = 3 ; // because SCL1/RP“3“/PMCS2/CN55/RD10  
RPINR20bits.SDI1R = 4 ; // because DPLN/SDA1/RP“4“/CN54/RD9  

Синхронизирующие циклы на главном чтении все еще НЕ генерировались моим модулем 1 PIC24 SPI.

Что случилось?

Если кто-нибудь может помочь - заранее спасибо!
Томас

1 ответ

Это проблема PPS? Ппс вроде нормально

Как можно реализовать 3+ проводное решение SPI с этим чипом?- Просто, управляя контактом CS независимо. Назначенный контакт CS предназначен для подчиненного режима. - ПДД для I2C не SPI.

А как насчет отображения ввода? Ввод осуществляется следующим образом:

_SDIxR=16;          //SDI

16, являющийся RP16 / RPi16, потому что выводы de RPi могут быть только введены, поэтому не отображайте часы на вывод RPI (RPi), они не будут работать.

В приведенном выше коде мы не видим, если бы вы установили синхронизацию модуля SPI, он может быть либо слишком медленным, либо слишком быстрым. Это делается в регистре SPIxCON1.

SPIxCON1bits.SPRE = 0b110; //secondary scale 111= prescale 1:1
SPIxCON1bits.PPRE = 0b00; // primary scale 10 = prescale 4:1
                          //  16 MIPS -> 4MIPS

Дальнейшие проверки:

  • Убедитесь, что контакты не находятся в аналоговом режиме, если они мультиплексируются с ним (AN на контакте на листе данных).

  • Для отладки также необходимо убедиться, что основные часы работают, например, вы можете переключить один контакт и запустить на нем зонд.

  • Проверьте свою электронику, убедитесь, что ничто не ведет линию вниз, как другая микросхема. Если чип нагревается больше обычного или потребляет больше энергии, это признак. С помощью пин-кода, установленного в качестве входа, вы можете попытаться продвинуться вниз / вверх по линии клика, чтобы увидеть, есть ли у вас короткое замыкание. Вы также можете, если вы можете распаять штифт.

Другие вопросы по тегам