Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MRF24J40MA SPI проблема
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Rf & Microwave Design
A. Fig Lee
Здравствуйте,
прикупил 2 модулька означенных на digikey, припаял контакты, подсоединил проводочками дюпон, тестирую.
Делаю ресет (отрицательный импульс на вывод)
и пытаюсь читать регистры, в которых после ресета есть установленные биты.
Не соответствует даташиту.
Как правило первый не нулевой MSB чиатется правильно, дальше с переменным успехом.
Попробовал писать в TXFIFO и регистры @ 0x200..
Если пишу 0xFF, читается 0xFF, если пишу 0хDF, например, читается 0хDE.
Если есть хоть 1 ноль в байте, последний бит всегда 0, чем больше 0 в байте, тем больше лишних нулей..
Ничего не понимаю..
Пользовал PIC16F26K22 аппаратный SPI, мод 00.
Смотрел логическим анализатором - говорит тоже самое что и PIC видит.
Взял другой модуль, подключил к ардуино, использовал библиотеку
https://github.com/karlp/Mrf24j40-arduino-library
и пример из http://projects.schneidr.de/2012/10/mrf24j40-and-arduino/
добавил запись и чтение регистров (пробовал и короткое и длинное)..
Так же ведет себя.

Доктор, что я делаю не так?


Вот очень похожий на мой паттерн данных посылаемых и получаемых здесь:

http://www.avrfreaks.net/index.php?name=PN...ic&p=857265
Voldemari4
Посмотрите как микрочип в своих библиотеках работает, может что-то с адресацией - я имею в виду длинные и короткие адреса.
A. Fig Lee
Цитата(Voldemari4 @ Jul 9 2014, 12:26) *
Посмотрите как микрочип в своих библиотеках работает, может что-то с адресацией - я имею в виду длинные и короткие адреса.


Сделал как у них.

Код
void initSPI()
{
    // enable SPI1
    ANSELA = 0;
    ANSELC = 0;
    TRISAbits.TRISA5 = 0; //1;
    PORTAbits.RA5 = 1;
    TRISCbits.TRISC3 = 0; //1;
    TRISCbits.TRISC4 = 1;
    TRISCbits.TRISC5 = 0;

    SSP1STATbits.SMP = 1;
    SSP1STATbits.CKE = 1;
    SSP1CON1bits.CKP = 0;
    SSP1CON1bits.SSPM = 0;
    SSP1CON1bits.SSPEN = 1;

}

void    mrf24j40_regWrite(uint8_t reg, uint8_t data)
{
    SS_LOW
    sendSPI((reg << 1) | 1);
    sendSPI(data);
    SS_HIGH
}

uint8_t mrf24j40_regRead(uint8_t reg)
{
    uint8_t ret;
    SS_LOW
    sendSPI(reg << 1);
    ret = sendSPI(0xFF);
    SS_HIGH
    return ret;
}

void    mrf24j40_memWrite(uint16_t addr, uint8_t data)
{
    SS_LOW
    sendSPI((((uint8_t)(addr>>3))&0x7F)|0x80);
    sendSPI((((uint8_t)(addr<<5))&0xE0)|0x10);
    sendSPI(data);
    SS_HIGH
}

uint8_t mrf24j40_memRead(uint16_t addr)
{
    uint8_t ret;
    SS_LOW
    sendSPI((((uint8_t)(addr>>3))&0x7F)|0x80);
    sendSPI((((uint8_t)(addr<<5))&0xE0));
    ret = sendSPI(0xFF);
    SS_HIGH
    return ret;
}


uint8_t d1, d2;
/*
*
*/
int main(int argc, char** argv) {

    init();

    // MRF24J40MA reset
    PORTCbits.RC2 = 0;
    __delay_ms(10);
    PORTCbits.RC2 = 1;
    __delay_ms(30);


    // можно закомментировать, ничего не меняется
    mrf24j40_init(26);
    for (int i = 0; i < 8; i++) {

        mrf24j40_memWrite( i+100, 0x79);
        mrf24j40_memRead(  i+100);
        mrf24j40_regWrite(0x10 + i, 0xFF - i);
        d2 = mrf24j40_regRead(0x10 + i);
   }
..
}


У меня в принципе вопрос такой:
если я ему подал ресет на pin и подождал,
он же должен значения регистров выдавать как в даташите, без всяких
моих дополнительных телодвижений, типа инициализации PLL и т.д.?
Voldemari4
А вот у вас ресет на RC2, а соответствующий ему TRISС2 похоже что настроен на вход
A. Fig Lee
Цитата(Voldemari4 @ Jul 9 2014, 13:17) *
А вот у вас ресет на RC2, а соответствующий ему TRISС2 похоже что настроен на вход

В init():

Код
void init() {
    TRISA = 0xF0;
    TRISB = 0xE7;
    // turn off analog inputs
    ANSELB = 0;
    //weak pullup is on by default
    // enable timer0
    T0CONbits.T0CS = 0; //internal timer
    T0CONbits.T0PS = 1; //1:4 - 4 uS clock
    T0CONbits.PSA = 1; //assign prescaler
    T0CONbits.TMR0ON = 1;


    initSPI();

    //MRFJ24 reset pin
    PORTCbits.RC2 = 1;
    TRISCbits.TRISC2 = 0;

}
Voldemari4
Вот читаю в инструкции, пункт 3.2
Цитата
Certain control register values must be initialized for basic operations. These values differ from the Power-on Reset values and provide improved operational parameters. These settings are normally made once after a Reset. After initialization, MRF24J40features can be configured for the application. The steps for initialization are shown in Example 3-1.
A. Fig Lee
Цитата(Voldemari4 @ Jul 9 2014, 15:07) *
Вот читаю в инструкции, пункт 3.2

Да, но у меня "Power on reset values" не сходятся с даташитом.
Сделал бит бэнг SPI на тех же ногах у PIC18F26K22.. Тот же результат.

Вот записываю и читаю в лупе в регистр 0х10:

00=>00
01=>00
03=>02
04=>00
05=>00
06=>04
07=>06
08=>00
09=>00
0A=>00
0B=>04
0C=>08
0D=>08
0E=>0C
0F=>0E
10=>00
11=>00
12=>00
13=>04

....
crying.gif

Пробовал замедлять, менял режимы SPI (вообще плохо), пробовал ставить
на вход ножку MOSI когда читаю данные ... Бесполезно пока..

Хоть в "длинные" регистры пиши, хоть в корокие.
Поменял SDI, SDO на пике на другие ножки.
Прогресса нет.
Остается грешить на негодные микросхемы..
A. Fig Lee
Heads up.
Поговорил с майкрочипом. Говорят не может быть, ничего не слышали чтоб был какойто брак с этими микросхемами. Рекомендовали не морочить голову, а попробовать имплементировать АН1192.
Отпишусь, как пойдет.

Уже легче
A. Fig Lee
Ничего мне это не дало.
Все тоже самое.
"Card is not inserted" потому чтение регистра по 0х10 дает 0хFE, не 0xFF.
Вот еще нашел товарищей по несчастью:
http://www.microchip.com/forums/m523339.aspx
Рекомендуют 120 Ом включить.
Попробую, отпишусь.
A. Fig Lee
Bingo!
Это было оно - добавил резистор 120 Ом межды выводом SDO MRF24J40MA и MISO пика.
Взелетело! rolleyes.gif
И пример майкрочипа работает АН1192, правда пришлось там функцию работы с SPI заменить для PIC18F26K22.

Ура!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.