Я пытаюсь прочитать регистр состояния для EEPROM, следуя инструкциям в этих указаниях по применению. Я хотел узнать мнение сообщества о сигналах, которые я получаю. Мне они не кажутся нормальными.
http://ww1.microchip.com/downloads/en/AppNotes/01073A.pdf
Схема подключения: я использую точно такую же распиновку, рекомендованную в примечаниях по применению.
Когда я читаю MISO, я получаю странное поведение.
Сигналы MOSI и CS:
Я получаю сигнал MOSI, как и ожидалось, на переднем фронте.
Я настраиваю часы так, чтобы они тикали на частоте 1 МГц.
Код инициализации SPI и рабочий код в файле main.c. (из eewiki, адаптировано под мои нужды)
#define eepromCS LATBbits.LATB15
void initSPI(void)
{
// Add GPIO config on pin RB15
eepromCS = 1; //GND
IEC0bits.SPI1EIE = 0;
IEC0bits.SPI1RXIE = 0;
IEC0bits.SPI1TXIE = 0;
SPI2CONbits.ON = 0;
SPI2BUF = 0;
SPI2BRG = 0; // 1MHZ
SPI2STATbits.SPIROV = 0;
/* SPI2CON Settings */
SPI2CONbits.FRMEN = 0;
SPI2CONbits.SIDL = 0;
SPI2CONbits.DISSDO = 0;
// 8 bits !
SPI2CONbits.MODE16 = 0;
SPI2CONbits.MODE32 = 0;
SPI2CONbits.CKP = 0; // Active state is high
SPI2CONbits.CKE = 0; // sampling from idle to active
SPI2CONbits.SSEN = 0;
SPI2CONbits.MSTEN = 1;
SPI2CONbits.SMP = 0; // sample during transmission
SPI2CONbits.ON = 1;
}
int main(void)
{
TRISBbits.TRISB15 = 0;
CSEEPROM = 1;
initSPI(); //EEPROM as a slave
unsigned char status;
unsigned char tmp;
//First READ
while (!SPI2STATbits.SPITBE);
eepromCS = 0;
SPI2BUF = 0x05;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
SPI2BUF = 0;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
eepromCS = 1;
write_char(status);
//Enable write LATCH
while (!SPI2STATbits.SPITBE);
eepromCS = 0;
SPI2BUF = 0x06;
while (!SPI2STATbits.SPIRBF);
tmp = SPI2BUF;
eepromCS = 1;
//Read Status register
while (!SPI2STATbits.SPITBE);
eepromCS = 0;
SPI2BUF = 0x05;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
SPI2BUF = 0;
while (!SPI2STATbits.SPIRBF);
status = SPI2BUF;
eepromCS = 1;
//write_char(status);
while (42);
return 0;
}
Я сделал скриншоты только для двух последних операций (запись включения защелки и чтение из регистра состояния). У меня точно такие же сигналы, когда я читаю регистр состояния перед тем, как отправить команду записи защелки.
Я использую макетную плату PIC32MX Olimex, ниже документация по прототипу и таблица данных EEPROM.
https://www.olimex.com/Products/PIC/Proto/PIC-32MX/resources/PIC-32MX.pdf http://ww1.microchip.com/downloads/en/DeviceDoc/22064B.pdf
Как обычно дьявол кроется в деталях, было бы здорово, если бы я мог по-новому взглянуть на свою проблему. Может быть, я что-то пропустил.
Спасибо за помощь !
PS: увеличение скорости до 20 МГц делает сигнал плоским, но не решает мою проблему.
Это не похоже на что-то связанное с кодом. Это выглядит либо как контакт, закороченный на другой выходной контакт, который установлен на ноль (или как другой ведомый, не выполняющий три состояния MISO). Отключите микросхему памяти, установите PIC MISO на вывод и попробуйте переключить, записав 1 и 0 в соответствующий бит порта.
Еще одним подозреваемым является питание микросхемы памяти. Убедитесь, что он получает VCC и имеет конденсатор от VCC до земли.
Мехди Сабват
Олег Мазуров
Мехди Сабват
Мехди Сабват