| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- // Файл импорта внешних функций
- // v 1.0 от 07/10/20
- // Автор: Сычев А.
- // Драйвер управления W25Q16JV использует интерфейсные функции SSP и системного таймера
- // Для нормальной работы требуется, чтобы в системе присутствовали следующие функции:
- // * функция обмена по SSP/SPI (двустороннйий обмен)
- // * функции управления ChipSelect
- // * функции задержки на микросекунды и миллисекунды
- // * функция получения отметки времени (системный таймер) в миллисекундах
- // * функция отключения/включения питания чипа
- // * функции работы с памятью
- #ifndef W25QXXX_IMPORT_H
- #define W25QXXX_IMPORT_H
- #include "drivers/flash/w25q/config/W25Q16JV_conf.h"
- typedef struct
- {
- #if W25QXXX_POWER_MANAGEMENT
- void ( *SetPinPowerOn)();
- void ( *SetPinPowerOff)();
- #endif
- #if W25QXXX_RESET_MANAGEMENT
- void ( *ResetPinAssert)();
- void ( *ResetPinRelease)();
- #endif
- #if W25QXXX_HW_WR_PROTECT
- void ( *HwWrProtPinAssert)();
- void ( *HwWrProtPinRelease)();
- #endif
- }
- ExtMemPins_Handle_W25Q_t;
- #ifdef W25QXXX_HAL_H
- // переопределите макросы на ваши функции (имя внутреннего макроса менять не надо)
- #include "stm32l1xx_hal.h" // HAL_GetTick()
- #include "core/main.h" // HAL_Wait_us()
- #include "drivers/spi/spi.h" // SPIHandle
- #include <string.h>
- // Import SPI handle
- #define pSPIHandle (&SPIHandle)
- #if W25QXXX_POWER_MANAGEMENT || W25QXXX_RESET_MANAGEMENT || W25QXXX_HW_WR_PROTECT
- extern const ExtMemPins_Handle_W25Q_t ExtMemPinsHandle_W25Q;
- // Import External Memory Pins Handle
- #define pExtMemPinsHandle (&ExtMemPinsHandle_W25Q)
- #endif
- // внутренний макрос | ваша функция
- #define __imp_sys_delayus(_1us) HAL_Wait_us(_1us) // ожидание, в микросекундах
- #define __imp_sys_delayms(_1ms) HAL_Delay(_1ms) // ожидание, в миллисекундах
- #define __imp_sys_gettimer() HAL_GetTick() // возвращает количество тиков системы с момента старта системы
- #define __imp_ssp_cshi() pSPIHandle->SetNSS() // #CS в состояние 1 (HiLogicLevel)
- #define __imp_ssp_cslo() pSPIHandle->ClrNSS() // #CS в состояние 0 (LoLogicLevel)
- #define __imp_ssp_ro(r,c) pSPIHandle->Receive(r,c) // функция обмена по SSP / SPI
- #define __imp_ssp_wo(w,c) pSPIHandle->Transmit(w,c) // функция обмена по SSP / SPI
- // ------------------------------------------------------------------------------------
- // __imp_ssp_io - функция двунаправленного обмена - не требуется, если есть __imp_ssp_ro и __imp_ssp_wo
- //#define __imp_ssp_io(w,r,c) pSPIHandle->TransmitReceive(w,r,c) // функция обмена по SSP / SPI
- // ------------------------------------------------------------------------------------
- // __imp_ssp_io_rev - функция передачи данных по SPI в обратном порядке байт.
- // Создается для ускорения процесса обмена. Если такая функция отсутсвует в вашей системе,
- // не объявляйте макрос __imp_ssp_io_rev. При этом драйвер будет сам инвертировать порядок
- // байт в ущерб производительности.
- /*
- #define __imp_ssp_io_rev(w,r,c) ssp_ior(w,r,c) // функция обмена по SSP / SPI в обратном порядке байт
- */
- #if W25QXXX_POWER_MANAGEMENT
- // Опция W25QXXX_POWER_MANAGEMENT
- #define __imp_flash_poweron() pExtMemPinsHandle->SetPinPowerOn()
- #define __imp_flash_poweroff() pExtMemPinsHandle->SetPinPowerOff()
- #endif
- #if W25QXXX_RESET_MANAGEMENT
- // Опция W25QXXX_RESET_MANAGEMENT
- #define __imp_flash_reset_assert() pExtMemPinsHandle->ResetPinAssert()
- #define __imp_flash_reset_release() pExtMemPinsHandle->ResetPinRelease()
- #endif
- #if W25QXXX_HW_WR_PROTECT
- // Опция W25QXXX_HW_WR_PROTECT
- #define __imp_flash_hwwrprotect_assert() pExtMemPinsHandle->HwWrProtPinAssert()
- #define __imp_flash_hwwrprotect_release() pExtMemPinsHandle->HwWrProtPinRelease()
- #endif
- // ------------------------------------------------------------------------------------
- // __imp_flash_powercycle - перезапуск чипа по питанию.
- // нужна для отключения блокировки регистра статуса "Status Register Lock"
- // Эта функция требуется ТОЛЬКО ЕСЛИ:
- // * 1) запрещено управление питанием (W25QXXX_POWER_MANAGEMENT = 0); и
- // * 2) требуется поддержка разблокировки регистра статуса
- // Если все эти условия выполняются, требуется такую функцию объявить и импортировать.
- // В остальных случаях она не требуется.
- // #define __imp_flash_powercycle() sys_flash_W25QXXX_pwrcycle() // отключение питания чипа
- // // Note: при остутствии возможности отключить питание чипа используйте
- // // данный вызов как callback-событие для того, чтобы пользователь сделал это.
- // ------------------------------------------------------------------------------------
- #define __imp_sys_memset(p,b,c) memset(p,b,c) // порт функции memset()
- #define __imp_sys_memzero(p,c) memset(p,0,c) // порт функции memset()
- #define __imp_sys_memcmp(p1,p2,c) memcmp(p1,p2,c) // порт функции memcmp()
- #define __imp_sys_memcpy(d,s,c) memcpy(d,s,c) // порт функции memcpy()
- #define __imp_sys_memmove(d,s,c) memmove(d,s,c) // порт функции memmove()
- // ------------------------------------------------------------------------------------
- #define __imp_utl_mutex_lock() // блокировка доступа к устройству ч/з мютекс
- #define __imp_utl_mutex_unlock() // разблокировка доступа к устройству ч/з мютекс
- #endif
- #endif
|