#define PTX_Device ;Это устройство является передатчиком MyAddress equ 1 ;Cетевой адрес ;Описание выводов процессора ------------------------------------------------------------------------------------- Button equ P0.2 ;(p15 <АН) Кнопка LED equ P0.3 ;(p16 >АН) Светлый TxD_pin equ P0.4 ;(p17 >АН) RxD_pin equ P0.5 ;(p18 <АН) IRQ equ P1.0 ;(p23 <АН) Прерывание от RFM73 SPI_SI equ P1.1 ;(p24 <АВ) Чтение данных SPI SPI_SO equ P1.2 ;(p25 >АВ) Запись данных SPI SPI_SCK equ P1.3 ;(p26 >АВ) Стробирование SPI SPI_CS equ P1.4 ;(p27 >АН) Выбор RFM73 CE equ P1.5 ;(p28 >АВ) Разрешение TX/RX C2D_pin equ P2.0 ;(p11) ;Распределение памяти IRAM --------------------------------------------------------------------------------------- ParamsZone equ 02Fh FlashBuffer equ 080h StackZone equ 090h ;Распределение памяти ERAM --------------------------------------------------------------------------------------- COMM_IBuffer equ 000h StreamsZone equ 0C8h SPI_Buffer equ 100h COMM_OBuffer equ 130h ;Распределение памяти Flash -------------------------------------------------------------------------------------- E_Signature equ 1B00h E_ParamsZone1 equ 1B10h E_ParamsZone2 equ 1B20h ;Декларирование размеров блоков ---------------------------------------------------------------------------------- MaxStreams equ 6 FlashBufferSize equ 16 CommInBufferSize equ 100 ;Описание констант ----------------------------------------------------------------------------------------------- UART_OwnCode equ UART_BDK OwnCode equ UART_OwnCode TotalParameters equ 6 ;Описание команд RFM73 ------------------------------------------------------------------------------------------- _R_REGISTER equ 000h _W_REGISTER equ 020h _R_RX_PAYLOAD equ 061h _W_TX_PAYLOAD equ 0A0h _FLUSH_TX equ 0E1h _FLUSH_RX equ 0E2h _REUSE_TX_PL equ 0E3h _ACTIVATE equ 050h _R_RX_PL_WID equ 060h _W_ACK_PAYLOAD equ 0A8h _W_TX_PAYLOAD_NOACK equ 0B0h _NOP equ 0FFh ;Описание регистров RFM73 ---------------------------------------------------------------------------------------- _CONFIG equ 00h _fMASK_RX_DR equ 40h _fMASK_TX_DS equ 20h _fMASK_MAX_RT equ 10h _fEN_CRC equ 08h _fCRC0 equ 04h _fPWR_UP equ 02h _fPRIM_RX equ 01h _EN_AA equ 01h _EN_RXADDR equ 02h _SETUP_AW equ 03h _SETUP_RETR equ 04h _RF_CH equ 05h _RF_SETUP equ 06h _STATUS equ 07h _fRBANK equ 80h _fRX_DR equ 40h _fTX_DS equ 20h _fMAX_RT equ 10h _TX_FULL equ 01h _OBSERVE_TX equ 08h _RX_ADDR_P0 equ 0Ah _RX_ADDR_P1 equ 0Bh _RX_ADDR_P2 equ 0Ch _RX_ADDR_P3 equ 0Dh _RX_ADDR_P4 equ 0Eh _RX_ADDR_P5 equ 0Fh _TX_ADDR equ 10h _RX_PW_P0 equ 11h _RX_PW_P1 equ 12h _RX_PW_P2 equ 13h _RX_PW_P3 equ 14h _RX_PW_P4 equ 15h _RX_PW_P5 equ 16h _FIFO_STATUS equ 17h _DYNPD equ 1Ch _FEATURE equ 1Dh ;Описание флагов ------------------------------------------------------------------------------------------------- bseg AT 0 UART_TX: dbit 1 NewByteArrival: dbit 1 TEMP1: dbit 1 TEMP2: dbit 1 RANGE_SIGN: dbit 1 ST_Hyperlink: dbit 1 ST_AutoReload: dbit 1 ST_Outsourcing: dbit 1 ST_PrevIsEmpty: dbit 1 ST_CreateStopped: dbit 1 ST_InvertBitLevel: dbit 1 ST_CreateIfNotExist: dbit 1 KeyHeld: dbit 1 bseg AT 70h AF_NotEnoughSpace: dbit 1 AF_AccessViolation: dbit 1 AF_LabelNotDefined: dbit 1 AF_ParametersChanged: dbit 1 AF_FlashError: dbit 1 AF_ParameterError: dbit 1 ;StoredFlags bseg AT 78h LNA_HCURR: dbit 1 ;0/1 = Low/High LNA Gain ;Описание переменных --------------------------------------------------------------------------------------------- dseg AT ParamsZone Descriptor: ds 1 RetranDelay: ds 1 ;0..15 = (X+1)*250uS RetranCount: ds 1 ;0..15 (0 - Retransmission Disabled) RF_Channels: ds 1 ;0..83..127(?) = 2400+X MHz DataRate: ds 1 ;0..3 = 1Mbps/2Mbps/250Kbps/2Mbps(?) RF_Power: ds 1 ;0..3 = -10dBm+(X*5dBm) ;dseg AT VarsZone OWPointer: ds 1 ORPointer: ds 1 IWPointer: ds 1 IRPointer: ds 1 RANGE_MIN: ds 1 RANGE_MAX: ds 1 L_TEMP_ADDR: ds 1 H_TEMP_ADDR: ds 1 L_Vector: ds 1 H_Vector: ds 1 StreamsCount: ds 1 ModeKeys: ds 1 SuspectKeys: ds 1 RepeatRound: ds 1 HoldTime: ds 1 SPI_Pointer: ds 1 ;Временные характеристики ---------------------------------------------------------------------------------------- Timer0 equ 45119 ;SYSCLK/48 (TMR0) ;ОСНОВНАЯ ЧАСТЬ ================================================================================================== cseg AT 0000h ljmp START cseg AT 0023h ljmp UART_Int cseg AT 0070h ;----------------------------------------------------------------------------------------------------------------- CodeSeg SEGMENT CODE rseg CodeSeg START: ;Инициализация оборудования lcall Init_Device clr CE ;Очистка RAM mov R0,#255 mov @R0,#0 djnz R0,$-2 ;Очистка ERAM mov DPTR,#0 clr A movx @DPTR,A inc DPTR mov A,DPH jnb ACC.1,$-5 ;Инициализация SFR mov SP,#StackZone-1 ;Проверка инициализации системы lcall CheckInit ;Загрузка рабочих параметров setb C lcall LoadVars ;Инициализация RFM73 mov A,#200 lcall PrecisionDelay_mS mov DataRate,#0 ;1 Mbps lcall RFM73_Init lcall RFM73_Prepare ;Включение режима переменной длины пакета mov A,#_ACTIVATE call CreateSPI mov A,#73h call PushAndStartSPI ;Подготовка к запуску lcall Init_KeysProcessor setb EA ; ----- Основной цикл ----- MainCycle: lcall COMM_Processor lcall KeysControl lcall RFM73_Processor lcall StreamsProcessor sjmp MainCycle ; ----- Описание логики работы ----- ShowCurrentMode: mov A,ModeKeys jnz $+3 ret ;Нажата кнопка mov ModeKeys,#0 mov RepeatRound,#255 ;Отправка пакета mov A,#_W_REGISTER + _CONFIG call CreateSPI mov A,#_fEN_CRC + _fPWR_UP call PushAndStartSPI mov A,#150 call PrecisionDelay_mS mov A,#_FLUSH_TX call CreateSPI call StartSPI setb CE mov A,#1 call PrecisionDelay_mS mov A,#_W_TX_PAYLOAD call CreateSPI mov A,#'T' call PushSPI mov A,#'E' call PushSPI mov A,#'S' call PushSPI mov A,#'T' call PushAndStartSPI mov A,#1 call PrecisionDelay_mS clr CE ; mov A,#20 ; call PrecisionDelay_uS ; setb CE ret ; ----- Процессор RMF73 ----- RFM73_Processor: jnb IRQ,$+4 ret #if defined(PTX_Device) ;Данное устройство назначено передатчиком clr CE mov A,#_W_REGISTER + _CONFIG call CreateSPI mov A,#_fEN_CRC call PushAndStartSPI mov A,#_FLUSH_TX call CreateSPI call StartSPI call PopSPI mov B,A anl A,#_fTX_DS jnz $+5 ljmp RFMP00 ;Данные успешно отправлены mov A,#_W_REGISTER + _STATUS call CreateSPI mov A,#_fTX_DS call PushAndStartSPI mov A,#_R_REGISTER + _OBSERVE_TX call CreateSPI call PushAndStartSPI call PopSPI call PopSPI anl A,#0Fh mov R0,#1 jz $+3 inc R0 clr LED mov A,#100 lcall PrecisionDelay_mS setb LED mov A,#100 lcall PrecisionDelay_mS djnz R0,$-14 RFMP00: mov A,B anl A,#_fMAX_RT jnz $+5 ljmp RFMP01 ;Данные не доставлены адресату mov A,#_W_REGISTER + _STATUS call CreateSPI mov A,#_fMAX_RT call PushAndStartSPI clr LED mov A,#250 lcall PrecisionDelay_mS mov A,#250 lcall PrecisionDelay_mS setb LED RFMP01: mov A,B anl A,#_fRX_DR jz $+3 ret mov A,#_W_REGISTER + _STATUS call CreateSPI mov A,#_fRX_DR jmp PushAndStartSPI #else ;Данное устройство назначено приемником mov A,#_NOP call CreateSPI call StartSPI call PopSPI mov B,A anl A,#_fRX_DR jnz $+3 ret ;Принят пакет с данными ; ;Получение номера канала ; mov A,#0Eh ; anl A,B ; rr A mov A,#_R_RX_PAYLOAD call CreateSPI call PushSPI call PushSPI call PushSPI call PushAndStartSPI call PopSPI call PopSPI cjne A,#'T',RFMP02 call PopSPI cjne A,#'E',RFMP02 call PopSPI cjne A,#'S',RFMP02 call PopSPI cjne A,#'T',RFMP02 clr LED mov A,#100 lcall PrecisionDelay_mS setb LED RFMP02: mov A,#_FLUSH_RX call CreateSPI call StartSPI mov A,#_W_REGISTER + _STATUS call CreateSPI mov A,#_fRX_DR jmp PushAndStartSPI #endif RFM73_Prepare: ;Подготовка каналов связи RFM73 clr C call RFM_SelectBank #if defined(PTX_Device) ;Данное устройство назначено передатчиком ;Указываем свой адрес для передачи mov A,#_W_REGISTER + _TX_ADDR call CreateSPI mov A,#MyAddress call PushSPI clr A call PushSPI call PushSPI call PushSPI call PushAndStartSPI ;Указываем свой адрес для приема ACK mov A,#_W_REGISTER + _RX_ADDR_P0 call CreateSPI mov A,#MyAddress call PushSPI clr A call PushSPI call PushSPI call PushSPI call PushAndStartSPI ;Разрешаем работу одной приемной точки Pipe0 mov A,#_W_REGISTER + _EN_RXADDR call CreateSPI mov A,#1 call PushAndStartSPI #else ;Данное устройство назначено приемником ;Указываем адреса обслуживаемых устройств mov A,#_W_REGISTER + _RX_ADDR_P0 call CreateSPI mov A,#1 call PushSPI clr A call PushSPI call PushSPI call PushSPI call PushAndStartSPI mov A,#_W_REGISTER + _RX_ADDR_P1 call CreateSPI mov A,#2 call PushSPI clr A call PushSPI call PushSPI call PushSPI call PushAndStartSPI ;Разрешаем работу приемных точек (Pipe0 и Pipe1) mov A,#_W_REGISTER + _EN_RXADDR call CreateSPI mov A,#3 call PushAndStartSPI ;Настраиваем ожидаемую длину пакета mov A,#_W_REGISTER + _RX_PW_P0 call CreateSPI mov A,#4 call PushAndStartSPI mov A,#_W_REGISTER + _RX_PW_P1 call CreateSPI mov A,#4 call PushAndStartSPI ;Включаем устройство в режиме приема mov A,#_W_REGISTER + _CONFIG call CreateSPI mov A,#_fEN_CRC + _fPWR_UP + _fPRIM_RX call PushAndStartSPI setb CE #endif ret RFM73_Init: ;Выбираем банк регистров 1 setb C call RFM_SelectBank ;Инициализация калибровочных регистров (MSB first) mov A,#_W_REGISTER + 0 call CreateSPI mov B,#4 call SPI_WritePack db 40h,4Bh,1,0E2h ;MSB call StartSPI mov A,#_W_REGISTER + 1 call CreateSPI mov B,#4 call SPI_WritePack db 0C0h,4Bh,0,0 ;MSB call StartSPI mov A,#_W_REGISTER + 2 call CreateSPI mov B,#4 call SPI_WritePack db 0D0h,0FCh,8Ch,2 ;MSB call StartSPI mov A,#_W_REGISTER + 3 call CreateSPI mov B,#4 call SPI_WritePack db 99h,0,39h,41h ;MSB call StartSPI mov A,#_W_REGISTER + 4 call CreateSPI mov B,#4 call SPI_WritePack db 0D9h,0B6h,82h,1Bh ;MSB call StartSPI mov A,#_W_REGISTER + 5 call CreateSPI mov B,#4 call SPI_WritePack db 24h,6,7Fh,0A6h ;MSB call StartSPI ; mov A,#_W_REGISTER + 6 ; call CreateSPI ; mov B,#4 ; call SPI_WritePack ; db 0,0,0,0 ; call StartSPI ; mov A,#_W_REGISTER + 7 ; call CreateSPI ; mov B,#4 ; call SPI_WritePack ; db 0,0,0,0 ; call StartSPI ; mov A,#_W_REGISTER + 8 ; call CreateSPI ; mov B,#4 ; call SPI_WritePack ; db 0,0,0,0 ; call StartSPI ; mov A,#_W_REGISTER + 9 ; call CreateSPI ; mov B,#4 ; call SPI_WritePack ; db 0,0,0,0 ; call StartSPI ; mov A,#_W_REGISTER + 10 ; call CreateSPI ; mov B,#4 ; call SPI_WritePack ; db 0,0,0,0 ; call StartSPI ; mov A,#_W_REGISTER + 11 ; call CreateSPI ; mov B,#4 ; call SPI_WritePack ; db 0,0,0,0 ; call StartSPI ;Инициализация калибровочных регистров (LSB first) mov A,#_W_REGISTER + 0Ch call CreateSPI mov B,#4 call SPI_WritePack db 0,12h,73h,5 ;LSB call StartSPI mov A,#_W_REGISTER + 0Dh call CreateSPI mov B,#4 call SPI_WritePack db 46h,0B4h,80h,00 ;LSB call StartSPI mov A,#_W_REGISTER + 0Eh call CreateSPI mov B,#11 call SPI_WritePack db 41h,20h,08,04,81h,20h,0CFh,0F7h,0FEh,0FFh,0FFh call StartSPI ;Выбираем банк регистров 0 clr C call RFM_SelectBank ;Устанавливаем длину адреса в 3 байта mov A,#_W_REGISTER + _SETUP_AW call CreateSPI mov A,#01 call PushAndStartSPI ;Установка времени и количества повторных ретрансляций mov A,#_W_REGISTER + _SETUP_RETR call CreateSPI mov A,RetranDelay swap A orl A,RetranCount call PushAndStartSPI ;Установка канала RF mov A,#_W_REGISTER + _RF_CH call CreateSPI mov A,RF_Channels call PushAndStartSPI ;Установка скорости передачи, мощности передатчика и усиления МШУ mov A,#_W_REGISTER + _RF_SETUP call CreateSPI mov A,RF_Power mov C,LNA_HCURR rlc A mov B,DataRate mov C,B.1 mov ACC.3,C mov C,B.0 mov ACC.5,C call PushAndStartSPI ;Разрешение загрузки пакета любой длины mov A,#_W_REGISTER + _DYNPD call CreateSPI mov A,#3Fh call PushAndStartSPI mov A,#_W_REGISTER + _FEATURE call CreateSPI mov A,#4 jmp PushAndStartSPI RFM_SelectBank: ;C=0/1 - BANK=0/1 push PSW mov A,#_NOP call CreateSPI call StartSPI call PopSPI anl A,#80h pop PSW rrc A jb P,$+4 ret push ACC mov A,#_ACTIVATE call CreateSPI mov A,#53h call PushAndStartSPI pop ACC rlc A sjmp RFM_SelectBank ; ----- Процессор последовательного порта ----- COMM_ProcessData: ;A - код команды cjne A,#NET_CMD_GET_ALL_VALUES,CPD00 mov A,#NET_MSG_GET_ALL_VALUES call COMM_NewPack mov A,Descriptor #if defined(PTX_Device) setb ACC.7 #endif lcall COMM_PushByte mov B,#TotalParameters - 1 mov R0,#ParamsZone + 1 mov A,@R0 lcall COMM_PushByte inc R0 djnz B,$-5 call AddRegisters jmp COMM_SendPack CPD00: cjne A,#NET_CMD_SET_VALUE,CPD01 call COMM_PopByte add A,#ParamsZone - 1 mov R0,A call COMM_PopByte mov @R0,A call SaveVars call ApplySettings mov A,#NET_MSG_GET_ALL_VALUES jmp COMM_ProcessData CPD01: cjne A,#NET_CMD_WRITE_PARAMETERS,CPD02 clr C call RFM_SelectBank call COMM_PopByte orl A,#_W_REGISTER call CreateSPI call COMM_PopByte call PushAndStartSPI mov A,#NET_MSG_GET_ALL_VALUES jmp COMM_ProcessData CPD02: jmp COMM_ClearInputBuffer AddRegisters: mov R0,#26 mov DPTR,#BANK0_Registers AR00: ;Определение адреса регистра clr A movc A,@A+DPTR mov B,A inc DPTR ;Определение длины регистра clr A movc A,@A+DPTR inc DPTR ;Чтение регистра из RFM73 xch A,B orl A,#_R_REGISTER call CreateSPI push B lcall PushSPI djnz B,$-3 call StartSPI lcall PopSPI ;Запись значения в буфер UART pop B lcall PopSPI lcall COMM_PushByte djnz B,$-6 djnz R0,AR00 ret BANK0_Registers: db 00h, 1 db 01h, 1 db 02h, 1 db 03h, 1 db 04h, 1 db 05h, 1 db 06h, 1 db 07h, 1 db 08h, 1 db 09h, 1 db 0Ah, 5 db 0Bh, 5 db 0Ch, 1 db 0Dh, 1 db 0Eh, 1 db 0Fh, 1 db 10h, 5 db 11h, 1 db 12h, 1 db 13h, 1 db 14h, 1 db 15h, 1 db 16h, 1 db 17h, 1 db 1Ch, 1 db 1Dh, 1 ApplySettings: mov C,CE push PSW clr CE lcall RFM73_Init pop PSW mov CE,C ret ; ----- Общие функции ----- DoScan: clr A mov C,Button cpl C rlc A ret PrecisionDelay_uS: nop clr C subb A,#2 push ACC nop nop djnz ACC,$-2 pop ACC nop nop djnz ACC,$-2 ret PrecisionDelay_mS: push B mov B,A PDMS00: mov A,#250 lcall PrecisionDelay_uS mov A,#250 lcall PrecisionDelay_uS mov A,#250 lcall PrecisionDelay_uS mov A,#250 lcall PrecisionDelay_uS djnz B,PDMS00 pop B ret StartInitMode: clr LED ret EndInitMode: setb LED ret ParameterError: ;Ошибка параметра setb AF_ParameterError ;R0-Адрес IRAM сбойного параметра, А-значение mov A,R1 dec A lcall GetDefaultValue mov @R0,A ljmp ContinueTestParams GetMinValue: inc A movc A,@A+PC ret db 0 ;Descriptor 0..255 db 0 ;RetranDelay 0..15 = (X+1)*250uS db 0 ;RetranCount 0..15 (0 - Retransmission Disabled) db 0 ;RF_Channels 0..82 = 2400+X MHz db 0 ;DataRate 0..3 = 1Mbps/2Mbps/250Kbps/2Mbps(?) db 0 ;RF_Power 0..3 = -10dBm+(X*5dBm) GetMaxValue: inc A movc A,@A+PC ret db 255 ;Descriptor 0..255 db 15 ;RetranDelay 0..15 = (X+1)*250uS db 15 ;RetranCount 0..15 (0 - Retransmission Disabled) db 127 ;RF_Channels 0..82..127(?) = 2400+X MHz db 3 ;DataRate 0..3 = 1Mbps/2Mbps/250Kbps/2Mbps(?) db 3 ;RF_Power 0..3 = -10dBm+(X*5dBm) GetDefaultValue: inc A movc A,@A+PC ret db 1 ;Descriptor 0..255 db 1 ;RetranDelay 0..15 = (X+1)*250uS db 3 ;RetranCount 0..15 (0 - Retransmission Disabled) db 2 ;RF_Channels 0..82 = 2400+X MHz db 1 ;DataRate 0..3 = 1Mbps/2Mbps/250Kbps/2Mbps(?) db 3 ;RF_Power 0..3 = -10dBm+(X*5dBm) GetParamSign: clr A ret ; ----- Подключаемые внешние модули ----- $include (..\Asm\F35x_Inc\UART_NetConstants.inc) $include (..\Asm\F35x_Inc\NET_Commands.inc) $include (HUM_RF_Config.asm) $include (..\Asm\F35x_Inc\SPI.asm) $include (..\Asm\F35x_Inc\Math.asm) $include (..\Asm\F35x_Inc\Flash.asm) $include (..\Asm\F35x_Inc\Streams.asm) $include (..\Asm\F35x_Inc\KeysProcessor.asm) $include (..\Asm\F35x_Inc\StartupFunctions3.asm) $include (..\Asm\F35x_Inc\UART_ERAM_ShortStandard2.asm) $include (..\Asm\F35x_Inc\_End.asm) end