|
|
  |
MRF24J40MA SPI проблема, странно себя ведет - доктор, что я делаю не так? |
|
|
|
Jul 9 2014, 14:57
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Здравствуйте, прикупил 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
Сообщение отредактировал A. Fig Lee - Jul 9 2014, 15:38
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 9 2014, 16:26
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-14
Из: Минск
Пользователь №: 81 582

|
Посмотрите как микрочип в своих библиотеках работает, может что-то с адресацией - я имею в виду длинные и короткие адреса.
|
|
|
|
|
Jul 9 2014, 16:38
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(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 и т.д.?
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 9 2014, 17:17
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-14
Из: Минск
Пользователь №: 81 582

|
А вот у вас ресет на RC2, а соответствующий ему TRISС2 похоже что настроен на вход
|
|
|
|
|
Jul 9 2014, 18:25
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(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;
}
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 9 2014, 19:07
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-14
Из: Минск
Пользователь №: 81 582

|
Вот читаю в инструкции, пункт 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.
|
|
|
|
|
Jul 9 2014, 19:56
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(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 ....  Пробовал замедлять, менял режимы SPI (вообще плохо), пробовал ставить на вход ножку MOSI когда читаю данные ... Бесполезно пока.. Хоть в "длинные" регистры пиши, хоть в корокие. Поменял SDI, SDO на пике на другие ножки. Прогресса нет. Остается грешить на негодные микросхемы..
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 12 2014, 14:35
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Ничего мне это не дало. Все тоже самое. "Card is not inserted" потому чтение регистра по 0х10 дает 0хFE, не 0xFF. Вот еще нашел товарищей по несчастью: http://www.microchip.com/forums/m523339.aspxРекомендуют 120 Ом включить. Попробую, отпишусь.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 13 2014, 00:57
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Bingo! Это было оно - добавил резистор 120 Ом межды выводом SDO MRF24J40MA и MISO пика. Взелетело! И пример майкрочипа работает АН1192, правда пришлось там функцию работы с SPI заменить для PIC18F26K22. Ура!
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|