-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Welcome to the my_note wiki!
- Markdown table Generator
-
TableConvert Online
在線Markdown table生成工具
- Markdown線上編輯器 MdEditor
- markdownpad2
- 簡介 perf_events 與 Call Graph
- 運用 gprof + graphviz 學習 Open Source
- 運用 gprof + graphviz 學習 Open Source (續)
- 程式海中的救生圈 cflow/callgraph
- 源碼分析:靜態分析 C 程序函數調用關系圖
- 繪製函式呼叫圖(call graph)(2):cflow graphviz
- Is there a cache in the ARM Cortex-M4?
- ARM Cortex-M33 (ARMv8-M) Keil Simulator Demo
- arm-trusted-firmware (ATF介紹)
- ARM Cortex-A7中斷系統基礎知識
- 使用QEMU調試ARM Trust Firmware, UEFI和Linux kernel
- ARM_Cortex-M4F_Instruction_Summary
- 淺談優先權,從ARM Cortex-M到FreeRTOS設定
- Cortex-M3 權威指南 - 中文
- *Cortex-M resources
- Cortex-M3 和 Cortex-M4 Fault 異常應用之基礎知識
- RISC-V Collaboration - Official Github
- SI-RISCV/e200_opensource: 蜂鳥E203
- Nuclei(芯來)
- five-embeddev (five-embeddev)
- freedom-e-sdk
- Spike 模擬器
- Prebuilt RISC‑V GCC Toolchain and Emulator
- riscv-none-embed-gcc-xpack
- riscv各種版本gcc工具鏈編譯與安裝
- riscv-probe
- RISC-V 手册
- RISC-V
- Freedom E SDK
- riscv-relocation issue
- *riscv分類 blog
- RISC-V:__global_pointer$
- **快速移植ARM程序至RISC-V
- 2018 iT 邦幫忙鐵人賽-系統架構秘辛:瞭解RISC-V 架構底層除錯器的秘密
- OS 和 trap: RISC-V 視角
- RV32I基礎整數指令集
-
.option
局部 enable 特殊指令集
/* 在 .option rvc; 和 .option pop; 之間便可以使用 RVC 指令集. * 而之外的部分, 則會只能使用正常指令集 */ .option push; .option rvc; c.addi a0, 1; c.slli a0, 1; .option pop
- Andes Technology - github
- 把 nds32 送進 Linux mainline 的經驗分享
- NDS32 Programming Guide
- BSP v310 Linux版的安裝方法
- BSP v3.2.1 silent mode
- uboot/.travis.yml-> nds32
- http://osdk.andestech.com/pre-release.html
- 5_AndeStarArchitecture
- ILM DLM的example code (N8)
- 科技難.不難 - Andes
- AndesCore N8 SoC週邊晶片驅動程式開發產學合作報告書
- nds32 open source repo
- Explore Memory and Resource Leak Detection Tools
- 在 linux 和 iOS 上抓 memory leak 和 heap profiling 心得
- linux 內存檢測工具 - valgrind,mprotect
- Linux C/C++內存越界定位: 利用mprotect使程序在crash在第一現場
- linux c之使用mprotect檢測內存訪問
- AddressSanitizer
- TLSF算法分析
- Memory Allocation
- 為ROM版芯片打patch
- SDK 入门手册
- ROM Patch Library
- ? ARM Cortex-M內核中ROM table的使用
- CM3 flash patch and breakpoint
- STMicroelectronics
- Espressif Systems
- Strange Lab
- Embedfire-stm32f103-zhinanzhe 野火
- iComm-semi
- hdscmcu
- Nuvoton Technology
- Silicon Labs
-
stm32f103
-
stm32duino/Arduino_Core_STM32: STM32 core support for Arduino
-
the Guide of Insider To The STM32 ARM®Based Microcontroller (PDF)
- ESP32系列芯片
- ESP-IDF 編程指南
- Espressif ESP32-DevKitC 和 ESP-WROVER-KIT 入門
- esp-aws-iot
- 如何為工業 IoT 應用選擇並使用合適的 ESP32 Wi-Fi/藍牙模組
- MicroPython on ESP32 學習筆記 (一) : 燒錄韌體
-
樂鑫音頻開發板
- ESP32-LyraT-Mini 是基於 ESP32-WROVER-E 模組的輕量級音頻開發板,支持語音喚醒和前端語音處理功能,如回聲消除 (AEC)、音頻自動增益 (AGC) 和降噪 (NS)。
- 設備連接 ESP RainMaker
- Espressif 里程碑
- ESP RainMaker 集成多種第三方語音服務
- ESP32物聯網開發框架ESP-IDF版本推薦
- XTENSA處理器介紹
- qemu模擬arm系統vexpress-a9—uboot+uImage
- QEMU模擬arm64 virt u-boot/linux
- 用Qemu搭建aarch64學習環境
- 利用 buildroot 與 Qemu 建構簡易 Embedded Linux 環境
- 用QEMU模擬運行uboot從SD卡啟動Linux
- qemu實踐一:arm + linux + u-boot + NFS
- QEMU 運行uboot,動態加載內核與文件系統
- 用buildroot編譯整個系統,用qemu仿真vexpressa9
- 基於 QEMU進行 arm 仿真開發 (以 vexpress-a9 為例)
# -append "root=/dev/mmcblk0 console=ttyAMA0 loglevel=8"
$ qemu-system-arm -M vexpress-a9 -smp 4 -m 256M \
-kernel output/images/zImage \
-append "root=/dev/mmcblk0 console=ttyAMA0 loglevel=8" \
-dtb output/images/vexpress-v2p-ca9.dtb \
-sd output/images/rootfs.ext2 \
-nographic \
-net nic,model=lan9118 \
-net user
killall qemu-system-arm
- Neural Network on Microcontroller-github
- Simple Neural Network on MCUs
- 机器学习100天
- Keyword Spotting Embedded on the ARM Cortex-M0
- Github
- IMXRT1010_Speech_Recognition
- Libsprec
- esp_sr
- ShawnHymel/ei-keyword-spotting
- *ARM-software/ML-KWS-for-MCU
- *CMU Sphinx
- *Picovoice/wake-word-benchmark
- The Best 7 Free and Open Source Speech Recognition Software Solutions
- squix78/esp32-tensorflow-microspeech
- *tflu-kws-cortex-m
- Software Packs
- Arm - Keil tools
- 【STM32F103筆記】一、搭建開發環境
- STM23程序下載與仿真調試
- 對於stm32仿真器下載程序事常見的問題(No Target Connected 錯誤和SWD/JTAG Communication Failure錯誤)解決方案。
- stm32學習(二)STM32F103ZET6內部資源講解
- STM32開發---CMSIS DAP下載器參數設置、故障排除
- 魔女開發板使用手冊
- Keil uVision5 MDK V5.27 官方最新版
- MDK5 Software Packs
- Keil uVision5 V5.26 中文免費版
- KEIL MDK 5.33版本 橫空出世 歡迎品鑑
- SVD
- STM32高階開發(16)-CMSIS DAP除錯工程
- OpenOCD 與 STM32
- CMSIS-DAP和openOCD那些事
- Windows下搭建GCC + Eclipse + OpenOCD的ARM開發環境
- wireless-esp8266-dap
- xjtuecho/CMSIS-DAP
- XIVN1987/DAPLink
- mick909/stm32-dap
- Driver Installation for On-board Debugger (CMSIS DAP)
- Windows 7 driver for MIMXRT1060-EVK
-
*jeanthom/stlink-tool
operate USB protocol to control stlink
-
stlink-org/stlink
reference USB control and GDB protocol
- 玩轉DAPLINK
- 自己動手做仿真器
- 自制超迷你CMSIS-DAP下載器
- Ubuntu下配置OpenOCD+FT2232
- Ubuntu下設定OpenOCD+FT2232
- 通過樂鑫原生 SDK-ESP IDF 連接 AWS IoT 平台
- Day 03: [Lab] 簡單操作OpenOCD
- 用 openocd 除錯 STM32F103
- STM32 OpenOCD調試
- CMSIS-DAP和openOCD那些事
- nabilt/STM32F4-Discovery-Firmware
- *OpenOCD學習筆記 2-運行
- *OpenOCD/CMSIS-DAP Debugging with Eclipse and without an IDE
- * duskwuff/stm32f103-example
- Implement CMSIS-DAP on STM32F103C8
- 用STM32F103C8芯片做一個CMSIS-DAP調試器
- xPack OpenOCD v0.11.0-1
- STM32 - Einstieg mit Em::Blocks
- evark/cbp-mbed
- evark/cbp-halmx
- GenieKits/CMSIS-DAP_on_STM32_with_EmBitz
- Bare Metal STM32 Development on Windows
- How to use ADICUP360 with EmBitz
- 基於ARM Cortex-M和Eclipse的SWO單總線輸出
- ARM 代碼燒錄方案與原理詳解 --- SWD/JTAG + Bootloader + OTA (ICP + ISP + IAP)
- SWD協議通信的簡單總結
- 解析SWD協議,燒寫程序
- *開源SWD脫機燒錄器-第二章 SWD協議移植
- *OfflineSWD
- SWD離線燒寫器(完全開源)
-
Idle task
-
Queue
-
FreeRTOS 監測 stack
/* enable options At FreeRTOSconfig.h */ #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* instance */ void task_sys_monitor(void *arg) { char pWriteBuffer[2048]; for(;;) { sys_msleep(10000); /* show task info */ vTaskList((char *)&pWriteBuffer); printf("task_name task_state priority stack tasK_num\n"); printf("%s\n", pWriteBuffer); } vTaskDelete(NULL); return; } /** * output: * task_name task_state priority stack tasK_num * TASK_LIST R 4 341 20 * LOGUART_T B 5 457 1 * * 'R' 代表準備態 ready * 'B' 代表阻塞態 blocked */
- Huawei LiteOS
- LiteOS-任務篇-源碼分析-任務調度函數
- 【LiteOS】LiteOS移植教程(STM32F103C8+MDK)
- 漫談LiteOS之開發板-LiteOS移植(基於GD32450i-EVAL)
- LiteOS-移植篇
- AliOS Things
- AliOS-Things-icomm_sv6266
- 如何在MCU上應用AliOS Things?
- AliOS Things FreeRTOS Porting Guide.zh
- alios
-
github
-
*內核移植
- U-Boot啟動過程--詳細版的完全分析
- uboot啟動分析第一階段(start.S)
- uboot啟動第二階段分析
- 用QEMU模擬運行uboot從SD卡啟動Linux
- 在家學習嵌入式2--在qemu環境下使用uboot啟動linux
- iMX_Working_with_Linux_and_uboot
- DfuSe file format
- uboot sf 命令用法
- uboot 與系統內核中 MTD分區的關係
- u-boot SPL啟動流程
- 圖解U-Boot(沒有SPL的uboot早期版本)
- uboot 下更改NAND的分區 fdisk
- uboot script
"for i in 1 2 3 4 5 6 7 ; do " \ "echo count ${i};" \ "if run loadbootscript; then " \ "run bootscript; " \ "else " \ "run mmcboot; " \ "fi; " "done;" \
-
eMMC chipset configuration
boot partition * 2 + rpmb * 1 + UDA * 1
-
check eMMC H/w partition and max blocks
for i in 0 1 2 3 4; do echo === switch H/w partition $i ====; mmc dev 0 $i; mmc read 0x80000000 0x7fffffff 1; done;
-
- Kconfig/kbuild 的祕密
- 嵌入式Linux根文件系統製作
- linux啟動時掛載rootfs的幾種方式
- online_linux_source
- Linux內核的5個子系統
- linux kernel source
- Linux 核心設計: 中斷處理和現代架構考量
- Linux 中斷(interrupt)子系統之一 子系統之一_中斷系統基本原理
- Linux kernel的中斷子系統之(一):綜述
- Linux內核同步之RCU
- Linux內核同步之RCU(2)
- Linux下如何訪問和修改u-boot環境變量?
-
kernel ramdisk
kernel預設ramdisk大小是4096KB 如果我們要更改ramdisk大小可以在grub的menu.lst裡更改開機參數 root (hd0, 0) kernel /boot/vmlinuz-2.4.34 rw root=/dev/ram0 init=/linuxrc vga=0x314 ramdisk=10240(10MB的意思) #ro代表read-only #如果想要可以在rootfs裡執行寫入的動作可以改成rw(read-write) #vga是設定支援framebuffer的參數0x314是代表800x600的解析度(網路上有表可以查詢) 這樣我們就可以在ramdisk裡裝更多東西啦~
- skbuff基礎結構
- The Socket Buffer: sk_buff Structure
- Linux 核心網路協議棧 ------sk_buff 結構體 以及 完全解釋
- sk_buff详解
- Linux套接口緩存——sk_buff
- Linux 核心網路協議棧 ------sk_buff 結構體 以及 完全解釋 2.6.16
- sk_buff 結構分析
- Linux網絡內核數據結構之sk_buff
- sk_buff封裝和解封裝網絡數據包的過程詳解
- Lwip之IP/MAC地址衝突檢測
- TCP/IP協議棧之LwIP(三)---網際尋址與路由(IPv4 + ARP + IPv6)
- 使用 LwIP TCP/IP 栈,在 STM32Cube 上开发应用
- STM32F107+LWIP+FreeRTOS
- BlueZ
- Bluetooth 基本架構,使用BlueZ介紹
- ARM平臺上藍芽協議棧Bluez的移植使用和配置
- zephyr
- Telink_825X_SDK
- mesh-core-on-nrf
- gattlib
- 在linux上安装Zephyr-OS并跑DEMO
- Zephyr Project 學習文檔
- 愛洋蔥- BLE
- [Bluetooth] Bluetooth 基本架構,使用BlueZ介紹
- ARM平台上藍牙協議棧Bluez的移植使用和配置
- Getting Started with Zephyr RTOS on Nordic nRF52832 hackaBLE
- Using NRF52 DK as BLE Controller on an older kernel host
- NimBLE - portable Bluetooth stack from Apache Mynewt
- mbed-BlueNRG_MS
- Packet Sniffers & Protocol Analyzers for Bluetooth
- zephyr學習藍牙部分
- Bluetooth Low Energy Controller in Zephyr OS
- 一分鐘讀懂低功耗藍芽(BLE)連線資料包
- 蝸窩科技 BLE
- 使用者程式跟蹤工具gprof調研資料
- 使用 GNU profiler 來提高代碼運行速度
- Linux下程式碼覆蓋率工具:gcov
- Tutorial: Using GNU Profiling (gprof) with ARM Cortex-M
- gprof 代碼效率測量
- C++ Profiler工具之初體驗
- gprof Profiling
- Perf -- Linux下的系統性能調優工具,第 1 部分
- Linux 效能分析工具: Perf
- Cycle Counting on ARM Cortex-M with DWT
- Software optimization resources
- 彙編效率優化:指令處理機制
- 彙編效率優化:打破依賴鏈
- llvm-mca命令詳解
- 你所不知道的 C 語言:編譯器與最佳化原理篇
- 系統記憶體優化工具
- Buildroot vs Yocto
- bitbake 使用指南
- BitBake 構建引擎
- BitBake helloWorld
- yocto 编译流程分析
- kconfig-frontends 簡介
- scons
-
what is a stub function?
系統開發中,可能程序S想要完成某個操作(比如讀取某個文件),但其本身沒有這個權限, 所以S必須調用一個模塊X。 X的作用是調用操作系統內核中用來讀取文件的模塊。 所以編程語言中的系統調用也可以理解為一種stub
-
C standard library
- 那些 libc 們
- picolibc/picolibc: picolibc - a C library designed for embedded 32- and 64- bit systems.
- musl libc
- klibc
- The Newlib Homepage
- RCold/rclibc: A minimal implementation of the C standard library.
- diet libc - a libc optimized for small size
- Welcome to uClibc-ng! - Embedded C library
- platform/bionic - Git at Google
-
C 語言的呼叫慣例
函數呼叫慣例, 也稱為函數參數傳遞慣例. 這個慣例描述了編譯器如何在一個函數呼叫另一個函數時傳遞參數. 為了使組合語言函數能被C語言函數成功呼叫; 反之亦然;組合語言函數必須截取參數, 然後將參數發送到由函數呼叫慣例定義的硬體資源上, 通常為暫存器或堆疊記憶體.
這些慣例將硬體暫存器分成被呼叫者保存(callee-saved or caller-used) 以及被呼叫者使用(callee-used or caller-saved)暫存器.
編譯器假設被呼叫者保存暫存器在函數呼叫過程中保持不變的值, 若組合語言程式設計人員希望使用這種暫存器, 他們必須先將暫存器的值備份, 然後在返回到C語言程式碼之前恢復這些暫存器的內容; 相反的, 被呼叫者使用暫存器被認為在函式呼叫過程中不會保持一定的值. 這意味著組合語言程式設計人員使用這些暫存器之前無需進行備份
-
常用的基礎 lib
- C++ STL 容器(一) - 基本介紹, vecor, queue, stack, set, map
- map/unordered_map原理和使用整理
- C++ map
- Learning C++ eBook (PDF)
- Assembly 基本語法
- Inline Assembly & Memory Barrier
- GCC在C語言中內嵌彙編 asm volatile
- Inline Assembly: 在C語言裡面嵌入assembly
- Rsr/Wsr - Special register access
-
PySimpleGUI
- 在 Gentoo Linux 下使用 crossdev 建立自己的 toolchain
- crosstool-NG
-
CFLAGS += -save-temps=obj # 保留中繼檔案, 包括展開前處理及 assembly
- GDB 插件
- 淺析棧溢出原理
- 步步學GDB-基本命令簡寫
- gdb-dashboard
- Ubuntu 建立 gdb cross-complier 開發環境
- Building GDB and GDBserver for cross debugging
- How to build GDB on Windows
- MSYS2下gdb-8.2編譯安裝
- windows下編譯gdb源碼
$ CC=gcc ./configure --enable-tui --with-curses --build=i686-w64-mingw32 --host=x86_64-w64-mingw32
x86_64-pc-msys
$ make
- DOC
- Plugin
- Vim 8 中 C/C++ 符號索引:GTags 篇
- ludovicchabant/vim-gutentags
- vimdiff,哪裡不同找哪裡,合併衝突也可以
- vim8 C/C++ IDE开发环境配置
-
使用Vim作为Git mergetool的高效方法
如果提示 merge 有衝突,才用
git mergetool
來merge - VIM配置:Grep插件安裝與配置
- vimdiff
]c 跳到下一個差異點 [c 跳到前一個差異點 按下 esc 以後可輸入指令 do 將另一個檔案的不同內容複製過來 dp 將目前游標所在檔案的不同內容, 複製到另一個檔案 zo 顯示隱藏 / 折疊的文字區塊 zc 將目前游標所在位置文字區塊隱藏 / 折疊 zr 將兩份文件都完全折 :diffupdate 強制更新頁面
- Diff Selections, Files, Directories and Git History with Vim
- 比較兩個文件中的兩個部分,而不是整個文件
- ctrlp-py-matcher
- Git 進階應用 Submodule 與 Subtree
- Git 如何產生Personal access tokens
- Windows上的Git:你如何設置合並工具
- (分享)濱野純訪談:為什麼 Google 接管開發 Git 2.0 了?
- [在Linux與Windows間傳送檔案](https://loveamberbird.wordpress.com/2013/08/21/%E3%80%90%E7%AD%86%E8%A8%98%E3%80%91%E5%9C%A8linux%E8%88%87windows%E9%96%93%E5%82%B3%E9%80%81%E6%AA%94%E6%A1%88%E6%AD%A5%E9%A9%9F%E6%95%99%E5%AD%B8/amp/)
- [Putty/Vim/Tmux 256色愛恨情愁](https://blog.laszlo.tw/?p=1057)
- [Copying commands with PuTTY and tmux](https://unix.stackexchange.com/questions/316751/copying-commands-with-putty-and-tmux)
- [bindable commands (keypad)](http://web.mit.edu/gnu/doc/html/features_7.html#SEC51)
- Linux tmux 終端機管理工具使用教學
- 進化版 screen - tmux
- 終端機 session 管理神器 — tmux
- Tmux使用手冊
- tmux 快速入門筆記
- 從0開始的 Tmux 教學 (一)
- Understanding FAT32 Filesystems
- MBR- Primary and Extended Partition
- Struktur-harddisk-MBR
- Understanding Master Boot Record (MBR)
- Master Boot Record
- RTOS文件系統對比:LittleFS Vs. SPIFFS
- Qt official Downloads
- Qt
- QT-example
- Qt教程,Qt5編程入門教程(非常詳細)
- Qt應用打包和發佈
- Qt5 Cadaques 正體中文版
- Qt Creator使用教程(簡明版)
- Qt 學習之路 2
-
$ mkdir build $ cd build $ cmake .. -G"MSYS Makefiles" $ cmake --build .
- Repository search results
- abumq/licensepp: Software licensing using digital signatures
- keygen-sh/example-cpp-cryptographic-license-files: Example of verifying cryptographically signed and encrypted license files using C++, OpenSSL, Ed25519 and AES-256-GCM.
- keygen-sh/example-cpp-user-authentication: Example of authenticating as a user and interacting with Keygen's API
- SurveyCake
- QCSG (中国南方电网有限责任公司)
- SGCC (国家电网)
sw rs2, offset(rs1) // *(rs1 + sign(offset)) = *rs2
lw rd, offset(rs1) // *rd = *(rs1 + sign(offset))
typedef struct state_node {
uint32_t state_id;
void *argv;
int (*method)(void *argv);
struct state_node *next;
} state_node_t;
-
嘗試重置pacman key
# rm -r /etc/pacman.d/gnupg/ # pacman-key --init # pacman-key --populate msys2 # pacman -Syu
-
A portable version of MinGW
-
IAP/ISP/ICP
-
ICP (In Circuit Program)
由 H/w 電路來支援燒錄, e.g. BIST
-
ISP (In System Program)
由系統端來支援燒錄, 一般會是 bootloader 的腳色
可以在 PROM 或是 Flash
-
IAP (In Application Program)
由應用端來支援燒錄, 廠家可以從 APP 來決定如何使用自家的燒錄方式
- 從 APP 下載 IAP 程序, 再切換到 IAP 程序來進行燒錄
- 將想要更新的 img, 下載到 IAP 佔存
- 其他
-
-
miniLZO
可用於 img 壓縮
-
UPX
可以對
*.exe
文件進行壓縮
- AWS IoT平台及架構入門(video)
- IoT 與cloud的愛恨情仇
- AWS新手的30天之旅 - 2. 註冊AWS帳號
- 快速入門AWS CLI與AWS POWERSHEL
- 什麼是 AWS IoT?
- ESP32 and AWS IoT Tutorial
- ESP32 開發筆記(三)ESP32 連接 AWS IOT
- 啟明雲端esp32開發板直連亞馬遜AWS IOT平台實例控制燈泡演示
- 亞馬遜雲物聯網AWS IoT初體驗
- Building an AWS IoT Core device using AWS Serverless and an ESP32
- Espressif ESP32-WROOM-32SE 入門
- Espressif ESP32-DevKitC 和 ESP-WROVER-KIT 入門
- ESP32連接亞馬遜你不得不知道的坑
- AWS 帳戶和存取金鑰
- Amazon Cloud Service 30 days challenge
- AWS 使用iot連接設備
- AWS物聯網解決方案之:如何將設備安全地接入AWS IoT
- ESP-AT 應用: AT+MQTT 對接亞馬遜雲
- AWS-FreeRTOS 入門
- 啟明雲端esp32開發板直連亞馬遜AWS IOT平台實例控制燈泡演示
- *通過樂鑫原生 SDK-ESP IDF 連接 AWS IoT 平台
- *ESP8266 連接AWS IoT(一)
- *ESP-IDF 下配置連接 AWS
- AWS- 建立 AWS IoT Core 教學
- Use Dragino device with Amazon AWS-IOT
- *ESP32 AWS IOT Arduino
- *設備 esp32_ESP32 設備運行 FreeRTOS IoT 操作系統
- How to Get Started with AWS IoT Core Quick Connect(video)
- How can I start publishing messages to AWS IoT Core from my device?(video)
- ESP-IDF WITH AWS IOT SUBSCRIBE AND PUBLISH EXAMPLE(video)
- 人臉辨識系統 Face Recognition 開發紀錄(OpenCV/Dlib)
- 基於 OpenCV 的人臉識別(強烈推薦)
- 基於OpenCV3實現人臉識別(實踐篇)
- 基於深度學習識別人臉性別和年齡
- 手部追蹤-youtube
- Zadig - USB driver installation made easy
- pbatard/libwdi
- USB 协议中文版
- 如何使用 WinUSB 與 USB 設備(USBDevice)通信
- 如何使用WinUSB与USB设备通信.pdf
- libusb win32簡介以及應用
- libuvc
-
example
//Define all SPI Pins #define SPI_OUT RC4_bit /* Define SPI SDO signal to be PIC port RC4 */ #define SPI_IN RC5_bit /* Define SPI SDI signal to be PIC port RC5 */ #define SPI_CLK RC3_bit /* Define SPI CLK signal to be PIC port RC3 */ #define SPI_CS RB1_bit /* Define SPI CS signal to be PIC port RB1 */ /** * This function writes a byte out onto the SPI OUT port, and reads a byte from * the SPI IN port. * * @param c Gives the byte to write out onto the SPI port * * @return Returns the byte read from the SPI IN port */ char spiPutGetByte(char c) { char ret; unsigned char mask; //SPI Mode 0. CS active low. Clock idle 0. Clock rising edge. SPI_CLK = 0; //Enable SPI communication. The SPI Enable signal must be pulsed low for each byte sent! SPI_CS = 0; //Ensure a minimum delay of 500ns between falling edge of SPI Enable signal //and rising edge of SPI Clock! Nop(); mask = 0x80; //Initialize to write and read bit 7 ret = 0; //Initialize read byte with 0 do { SPI_OUT = 0; //Clock out current bit onto SPI Out line if (c & mask) SPI_OUT = 1; SPI_CLK = 1; //Set SPI Clock line if (SPI_IN) ret |= mask; //Read current bit fromSPI In line Nop(); //Ensure minimum delay of 500nS between SPI Clock high and SPI Clock Low SPI_CLK = 0; //Set SPI Clock line mask = mask >> 1; //Shift mask so that next bit is written and read from SPI lines Nop(); //Ensure minimum delay of 1000ns between bits } while (mask != 0); //Ensure a minimum delay of 750ns between falling edge of SPI Clock signal //and rising edge of SPI Enable! Nop();Nop(); //Disable SPI communication. The SPI Enable signal must be pulsed low for each byte sent! SPI_CS = 1; return ret; }
-
example1
#include <SPI.h> #include "ButtonDebounce.h" #include "basic_clock.h" #include "unknown.h" #define CS_Bit 2 /* A2 is bit 2 in PortC */ #define SClk_Bit 5 /* pin 13 is bit 5 in PortB */ #define MISO_Bit 4 /* pin 12 is bit 1 in PortB */ int count; int EncoderValueT; void SW_SPI_Initialize() { bitSet(DDRC, CS_Bit); bitSet(PORTC, CS_Bit); bitSet(DDRB, SClk_Bit); // pin 13 is an output.bitClear bitClear(PORTB, SClk_Bit); // Clock starts low.bitSet bitClear(DDRB, MISO_Bit); // MOSI is low } unsigned int SW_SPI() { unsigned int Output; bitClear(PORTC, CS_Bit); // Chip Select low. for (int i = 15; i >= 0; i--) { bitSet(PORTB, SClk_Bit); // clock high if ( PINB & 0x010) // OR digitalRead( MISO_Pin ) { bitWrite( Output, i, 1 ); } else { bitWrite( Output, i, 0 ); } bitClear(PORTB, SClk_Bit); // Clock low. } bitSet(PORTC, CS_Bit); // cs off return Output; }// End of SW_SPI unsigned long ButtonTimer, ClkTimer; int encoderPosition; float TempBits1; float TempBits2; float ReadTemperature() { TempBits1 = ((SW_SPI() >> 3) & 0x0fff); float Temperature = 0.25 * (float) TempBits1; return Temperature; //C } void setup() { SW_SPI_Initialize(); ButtonInitialize(4); EncoderInitialize(); ButtonTimer = millis(); lcd.begin(16, 2); lcd.clear(); Serial.begin(9600); ClkTimer = millis(); count = 10; EncoderValueT = EncoderValue; }
-
example3
#include <stdint.h> #include <avr/io.h> /* default pins */ #define SOFTSPI_CLK_DDR DDRD #define SOFTSPI_CLK_PORT PORTD #define SOFTSPI_CLK_MASK (1 << 3) #define SOFTSPI_MOSI_DDR DDRD #define SOFTSPI_MOSI_PORT PORTD #define SOFTSPI_MOSI_MASK (1 << 4) #ifndef SOFTSPI_DONT_USE_MISO #define SOFTSPI_DONT_USE_MISO 0 #endif #if (SOFTSPI_DONT_USE_MISO == 0) #define SOFTSPI_MISO_DDR DDRD #define SOFTSPI_MISO_PIN PIND #define SOFTSPI_MISO_MASK (1 << 5) #endif static void softspi_setup_master(void) { SOFTSPI_CLK_DDR |= SOFTSPI_CLK_MASK; SOFTSPI_MOSI_DDR |= SOFTSPI_MOSI_MASK; #if (SOFTSPI_DONT_USE_MISO == 0) SOFTSPI_MISO_DDR |= SOFTSPI_MISO_MASK; #endif } static inline void softspi_clk_low(void) { SOFTSPI_CLK_PORT &= ~SOFTSPI_CLK_MASK; } static inline void softspi_clk_high(void) { SOFTSPI_CLK_PORT |= SOFTSPI_CLK_MASK; } static inline void softspi_mosi_low(void) { SOFTSPI_MOSI_PORT &= ~SOFTSPI_MOSI_MASK; } static inline void softspi_mosi_high(void) { SOFTSPI_MOSI_PORT |= SOFTSPI_MOSI_MASK; } static inline void softspi_write_bit(uint8_t x, uint8_t m) { /* dac7554 samples at clock falling edge */ /* 5 insns per bit */ softspi_clk_high(); if (x & m) softspi_mosi_high(); else softspi_mosi_low(); softspi_clk_low(); } static void softspi_write_uint8(uint8_t x) { /* transmit msb first, sample at clock falling edge */ softspi_write_bit(x, (1 << 7)); softspi_write_bit(x, (1 << 6)); softspi_write_bit(x, (1 << 5)); softspi_write_bit(x, (1 << 4)); softspi_write_bit(x, (1 << 3)); softspi_write_bit(x, (1 << 2)); softspi_write_bit(x, (1 << 1)); softspi_write_bit(x, (1 << 0)); } static inline void softspi_write_uint16(uint16_t x) { softspi_write_uint8((uint8_t)(x >> 8)); softspi_write_uint8((uint8_t)(x & 0xff)); } #if (SOFTSPI_DONT_USE_MISO == 0) static inline void softspi_read_bit(uint8_t* x, uint8_t i) { /* read at falling edge */ softspi_clk_high(); #if 0 /* no need, atmega328p clock below 50mhz */ /* softspi_wait_clk(); */ #endif softspi_clk_low(); if (SOFTSPI_MISO_PIN & SOFTSPI_MISO_MASK) *x |= 1 << i; } static uint8_t softspi_read_uint8(void) { /* receive msb first, sample at clock falling edge */ /* must be initialized to 0 */ uint8_t x = 0; softspi_read_bit(&x, 7); softspi_read_bit(&x, 6); softspi_read_bit(&x, 5); softspi_read_bit(&x, 4); softspi_read_bit(&x, 3); softspi_read_bit(&x, 2); softspi_read_bit(&x, 1); softspi_read_bit(&x, 0); return x; } static inline uint16_t softspi_read_uint16(void) { /* msB ordering */ const uint8_t x = softspi_read_uint8(); return ((uint16_t)x << 8) | (uint16_t)softspi_read_uint8(); } #endif /* SOFTSPI_DONT_USE_MISO == 0 */