Перейти к содержанию

Serin2 - проблема


Nuken

Рекомендуемые сообщения

Здравствуйте!

Пишу код на PICBasic Pro 2.47 для PIC16F628A. Суть программы в следующем:

1) Получать команды от ПК через СОМ порт

2) Отправлять данные смарт карте

3) Получать ответ от смарт карты и передавать на СОМ порт

4) Делать сброс смарт карты, принимать АТР и передавать на СОМ порт

Так как я не знал, какой режим выбирать для работы с смарт картой через I/O порт, то написал небольшую программку, которая по команде с ПК делает карте ресет и в завивисимости от параметров команды с ПК принимает АТР в соотв режиме:

DEFINE OSC 20
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRGH 1
DEFINE HSER_SYNC 0
DEFINE HSER_SPBRG 129

CardData					var PORTA.0	 ' Data Pin for Smart Card
CardReset				   var PORTA.1	 ' Card Reset Pin

ByteIn					  var byte
Result					  var word

ServiceParams			   var byte[5]	  'Service Command Parameters   [CardType, TransmitionType, CardTimeOut, SerialTimeOut,ResetMode]
APDUHeader				  var byte[5]	  'APDUHeader = [CLA,INS,P1,P2,P3]
SCATR					   var byte[33]

' Command Type Definitions
ctCardMenagementCommand	   con $AA
' Card Types
ctSmartCard				 con $00
' Transmition Type
ttDirect					con $00
ttInvert					con $01
' ResetMode
rmLowHigh				   con $00
rmHighLow				   con $01
' TimeOuts Default
CardTimeOutDefault		  con 200
SerialTimeOutDefault		con 200

' SERIN2 AsynchModes
DrivenTrueNone9600		  con 84
DrivenTrueEven9600		  con 8267

CMCON = 7

ServiceParams[0] = ctSmartCard
ServiceParams[1] = ttDirect
ServiceParams[2] = CardTimeOutDefault
ServiceParams[3] = SerialTimeOutDefault
ServiceParams[4] = rmLowHigh

'*********************************************************************************

StartProgram:
HSERIN ServiceParams[3],StartProgram,[ByteIn]
hserout [ByteIn]												 ' подтверждаем получение ByteIn
SELECT case ByteIn
 CASE ctCardMenagementCommand
  GoTo CardManagement
END SELECT
GoTo StartProgram

CardManagement:
hserin ServiceParams[3],StartProgram,[str APDUHeader\5]
if APDUHeader[0] = $00 then
 if ServiceParams[0] = ctSmartCard then
  select case APDUHeader[1]
case 0
 Result  = DrivenTrueNone9600
 define SER2_BITS 8
case 1
 Result  = DrivenTrueEven9600
 define SER2_BITS 9
 select case ServiceParams[1]
  case ttDirect
   define SER2_ODD 0
  case ttInvert
   define SER2_ODD 1
 end select 
  end select
  If ServiceParams[4] = rmLowHigh then
CardReset = 0
CardReset = 1
  else
CardReset = 1
CardReset = 0 
  endif 
  i = 0
  ReadATR:
serin2 CardData,Result,ServiceParams[2],EndATR,[ByteIn]
SCATR[i] = ByteIn
i = i + 1
goto ReadATR
  EndATR:
HSERout [STR SCATR\i]
 endif
endif 
GOTO StartProgram

Таким образом, я, отправляя массив AAh 00h XXh 00h 00h 00h, могу выбирать режим работы с картой. Оказалось, что подходит самый первый вариант, получаю АТР такой же, как и через Phoenix интерфейс. Тогда пишу следующий код:

DEFINE OSC 20
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRGH 1
DEFINE HSER_SYNC 0
DEFINE HSER_SPBRG 129
DEFINE SER2_BITS 8		 ' хотя можно эти три строки не писать, так как по эти настройки идут по умолчанию
DEFINE SER2_ODD 0

тра-та-та...
тра-та-та...
тра-та-та...

CardManagement:
hserin ServiceParams[3],StartProgram,[str APDUHeader\5]
if APDUHeader[0] = 0 then
 if ServiceParams[0] = ctSmartCard then
  If ServiceParams[4] = rmLowHigh then
CardReset = 0
CardReset = 1
  else
CardReset = 1
CardReset = 0 
  endif 
  i = 0
  ReadATR:
serin2 CardData,DrivenTrueNone9600,ServiceParams[2],EndATR,[ByteIn]
SCATR[i] = ByteIn
i = i + 1
goto ReadATR
  EndATR:
HSERout [STR SCATR\i]
 endif
endif
GOTO StartProgram

И в ответ получаю другой АТР!!! :blink: Возвращаю все к первому варианту - опять получаю данные отлично. Пробовал вобще убрать DEFINE для настройки SERIN2. Результат тот же - АТР неправильный :( . Пробовал убрать подтягивание через резистор 10 кОм на +5В - без изменений, проблема таже самая. В чем проблема???!!! Где собака порылась?

Спасибо!!!

З. Ы. Я только начал работать с PIC-ами, может что-то недопонимаю или не вижу какой-то элементарной вещи.

Изменено пользователем Nuken
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Скорее всего подходящий все-таки не первый вариант.

9600 бод

Четность : ODD

и MODE какой-то нестандартный

DrivenTrueEven9600 con 8267

в мануале 8276

Изменено пользователем nessy
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Скорее всего подходящий все-таки не первый вариант.

9600 бод

Четность : ODD

и MODE какой-то нестандартный

DrivenTrueEven9600 con 8267

в мануале 8276

1) Попробовал - результат тот же

2) Ошибку исправил - не помогло

3) Спасибо

Ищем дальше...

Изменено пользователем Nuken
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1) Перевел все на порт В.3, так как было предположение, что на А.0 триггер Шмиддта все портит

2) Подтяжка на +5 В нужна по докам для смарт карты

3) Еще куча всякой мелочи...

Вобщем АТР получаем стабильно, дальше - посылка команд и прием ответа.

То nessy: уже решал такую задачу? почему уверен в выборе режима 9600, ODD?

Ссылка на комментарий
Поделиться на другие сайты

Да нет, просто логично предположить, что если уж софт может

правильно принимать, то ошибка в режиме приема.

Ясно, я подумал, что хоть кто-то уже делал подобное... Много форумов облазил и нигде ничего, только очень общие рассуждения на тему...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...