SIM900A - Пошаговая инструкция как я перепрошил

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Доброе время коллеги! Купил за дешево на али 2 модуля GSM, не разобравшись в моделях... Пришли, оказалось что SIM900A, которые не работают в России. Покурив форумы и прочую литературу, стало понятно, что это исправимо перепрошивкой.

Вот такой модуль:

Мини модуль SIM900A

На нем видно, что есть микросхема порта MAX232, которая позволяет общаться с СОМ портом "на прямую", но т.к. нет в инете даташитов по этому модулю, сложно определить как подключать его. Слева, вверху на моем варианте была распайка на плате под выводы, которых не было. Впаял сам. На просторах инета нашел информацию, что для работы с этими выводам нужно замкнуть двумя перемычками выводы по середине, как на рисунке. Перед подключением никаких операций с модулем в режите АТ команд не проводил, проверил только один параметр - скорость подключения стоит у него в режиме Авто, а также получил информацию о текущей прошивке командой "AT+GMR". Далее столкнулся с тем, что в системнике есть порт СОМ1, но нет планки ссзади. Помогла эта схемка:

Схема порта на материнке

Здесь я взял ногу 2, 3 и 5 на материнке и напрямую ткнул модуль по такой распиновке:

Модуль 1pin -TX    -->  COM 2pin RxD

Модуль 2pin -RX    -->  COM 3pin TxD

Модуль 3pin -GND  -->  COM 5pin Gnd

Затем запустил программу "SIM900 Series download Tools Develop 1.9" которая в инете валяется свободно.

Перешел на закладку @Serial Upload@ чтобы прочитать данные с модуля. Поле "Target" = SIM900A, "Baud Rate" = 57600 (115200 не захотела стабильно работать с модулем). "Upload Total Flash" = пометить, чтобы создать резерв на всякий))  Далее по такому алгоритму:

1) Подключил к материнке порт модуля

2) В программе нажал кнопку Start Upload

3) Подключил питание  +5 и Gnd на модуль (взял от блока питания компа, с ветки FDD, такое питание еще хорошо тем, что выводы порта согласованы по питанию с Gnd)

4) В окне программы появилась информация о модуле и пошел процесс закачки. Порядка 15 минут составило ожидание на скачивание.

При получении информации о модуле, можно определить какой размер флеш-памяти и что на данный момент в нее залито, чтобы определить какую прошивку вам искать в инете. В моем случае:

FlashSize = 64Mb

FlashName = M65WR064KU

И прошивка сюда подошла такая "1137B12SIM900M64_ST"

Далее все по тому же алгоритму, только уже на закладке "Serial Download", т.е заливание прошивки. В поле EraseType = "Erase User Data and Code", больше ничего не менять.  Файл для заливки имеет расширение *.cla

После прошивки можно перезагрузить модуль, убрать перемечки, и например подключить к АрдуиноМега (как в моем случае) чтобы пообщаться с ним. Выкладываю свою прошивку ардуины для коммутации в режиме АТ команд:

// Модуль хорошо работает с GPRS шилдом от Амперки, при том, что она соединена на Serial1 нашей АрдуиноМега
// буфер PC Serial
char bufferPC_Serial[64];
// буфер GPRS Serial
char bufferGPRS_Serial[64];

int i = 0;
int j = 0;

void gprs_OnOff()
{
  // настраиваем пин №2 в режим выхода
  pinMode(2, OUTPUT);
  // проверяем состояние 3 пина
  if (digitalRead(3) != HIGH) {
    // если на нём «низкий уровень»
    // подаём на пин 2 «высокий уровень»
    digitalWrite(2, HIGH);
    // ждём 3 секунды
    delay(3000);
  }
  // подаём на пин 2 «низкий уровень»
  digitalWrite(2, LOW);
}
void clearBufferPC_Serial()
{
  for (int t = 0; t < i; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    bufferPC_Serial[t] = 0;
  }
}

void clearBufferGPRS_Serial()
{
  for (int t = 0; t < j; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    bufferGPRS_Serial[t] = 0;
  }
}
void serialPCread()
{
  i = 0;
  // если появились данные с компьютера
  if (Serial.available() > 0) {
    while (Serial.available() > 0) {
      // пока идёт передача данных,
      // записываем каждый байт в символьный массив
      bufferPC_Serial[i++]=(Serial.read());
    }
    // добавляем символ конца строки
    bufferPC_Serial[i] = '\0';
    // записываем данные в GPRS Shield
    Serial1.println(bufferPC_Serial);
    Serial.println("");
    // очищаем буфер PC Serial
    clearBufferPC_Serial();
  }
}
 
void serialGPRSread()
{

    j = 0;
    // если появились данные с GPRS Shield
    if (Serial1.available() > 0) {
      while (Serial1.available() > 0) {
        // пока идёт передача данных,
        // записываем каждый байт в символьный массив
        bufferGPRS_Serial[j++]=(Serial1.read());
        
    }
    // добавляем символ конца строки
    bufferGPRS_Serial[j] = '\0';   
    // выводим полученные данные с GPRS Shield в Serial-порт
    Serial.write(bufferGPRS_Serial);    
    // очищаем буфер GPRS Serial
    clearBufferGPRS_Serial();
    }  
}
 
void powerOff(){ 
  if(digitalRead(3)==HIGH)  {
    digitalWrite(2, HIGH);
    delay(3000);  }
  digitalWrite(2, LOW);
  delay(3000);
}

void powerOn()
{
 if(digitalRead(3)==LOW)  {
    digitalWrite(2, HIGH);
    delay(3000);  }
  digitalWrite(2, LOW);
  delay(3000); 
}

void gprsTest()
{
  // бесконечный цикл
  while (1) {
    // ждём 1 секунду
    delay(1000);
    j = 0;
    // посылаем в GPRS Shield АТ-команду "AT"
    Serial1.println("AT");
    // если появились данные с GPRS Shield
    if (Serial1.available() > 0) {
      while (Serial1.available() > 0) {
        // пока идёт передача данных,
        // записываем каждый байт в символьный массив
        bufferGPRS_Serial[j++] = Serial1.read();
      }
      // добавляем символ конца строки
      bufferGPRS_Serial[j] = '\0';
      // посылаем АТ-команду "AT"; если GPRS Shield исправен,
      // он должен вернуть команду "AT";
      // сравниваем всё что находиться в буфере GPRS Shield
      // со строкой "AT\r\n\r\nOK\r\n"
      if (strcmp(bufferGPRS_Serial, "AT\r\n\r\nOK\r\n") == 0) {
        // если всё верно выводим в Serial порт "State OK"
        // и выходим из бесконечного цикла
        Serial.println("State OK");
        break;
      } else {
        // если строки разные, значит произошла ошибка
        // выводим сообщение об ошибке и продолжаем цикл
        Serial.println("Init ERROR");
      }
    }
    // очищаем буфер GPRS Serial
    clearBufferGPRS_Serial();
  }
}
 
void setup()
{
  // включаем GPRS-шилд
  Serial.begin(9600);
  
  gprs_OnOff();
  Serial.println("GPRS Init");
  // открываем последовательный порт для мониторинга действий в программе
   // открываем последовательный порт
  // для связи с GPRS-устройством со скоростью 9600 бод
  Serial1.begin(9600);
   while (!Serial) {
    // ждём, пока не откроется монитор последовательного порта
    // для того, чтобы отследить все события в программе
  }
 
  // пока не установится связь с GPRS-устройством, будем крутиться в теле функции
  Serial.println("Power Init");
  powerOff();
  powerOn();
  Serial.println("Test Init");
  gprsTest();
}
 
void loop()
{
   // считываем данные с компьютера и записываем их в GPRS Shield
  serialPCread();
  delay(500);
  // считываем данные с GPRS Shield и выводим их в Serial-порт
  serialGPRSread();
}

Вроде все на этом. Если есть вопросы - пиште )) может что смогу ответить)

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Забыл еще сказать, что модуль подключается к ардуине без перемычек, с центральных штырьков (5VT и 5VR - означает уровень TTL 5 Вольт, T=TX, R=RX) К ардуине цепляем на крест -  TX = RX, RX=TX

Просто Амперская шилда например цепляется на прямую TX=TX, RX=RX )))

После прошивки - вот команды для проверки работы модуля:

AT+GMR -инфа о прошивке
Revision:1137B12SIM900M64_ST
OK

AT+COPS? -инфа об операторе симки
+COPS: 0,0,"Tele2"
OK

AT+CPAS - Инфа о готовности работы
+CPAS: 0
OK

AT+CREG? - инфа о регистрации в сети
+CREG: 0,1
ОK

Эпопея продолжается ))) Стал тестировать DTMF сигналы, оказалось, что моя прошивка не поддерживает их... на команду AT+DDET?  выдает ошибку Error... Стал копать дальше, нашел другую прошиву:  1137B02SIM900R64_ST_ENHANCE, но при попытке залить ее - программа говорит, что не верно указано устройство в поле Target. Ни один вариант не подошел. Пришлось поставить галку "Don't ccheck file name", и тогда все залилось. Но я так понял, что она опасна в том случае, если не проверен объем файла с размером flash на модуле. Может произойти непоправимое. .

Сейчас все прошил, все работает, и DTMF сигналы распознаются ))
 

P.S. Случайно заметил, что модуль прошивается и читается через MAX232 без перемычек! )))

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Заводские данные при чтении с модуля информации:

Заводская прошивка Sim900A

А это уже прошивка 1137B02SIM900R64_ST_ENHANCE

Процесс прошивки

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Опять не все ладно)) DTMF появилась функция, но не хочет с этой прошивкой регится у оператора ))) Меняю на 1137B06SIM900M64_ST_ENHANCE, проверим что будет... А так - кому интересно, беру я их от сюда - http://dostmuhammad.com/blog/sim900-firmware-update-tutorials-appnotes/?doing_wp_cron=1485245906.6364529132843017578125

Все отлично! Теперь все работает )) DTMF и регистрация в сети GSM ))) Ура! Я это сделал!