arduino - ADE7953板上的SPI
问题描述
所以,我一直在尝试在开发板和我的 arduino 之间实现 SPI 通信。在板的手册中,它说需要发送两个字节以及我要读/写的地址和另一个字节来选择读或写(最高有效位告诉你哪个将适用)。但是,我的代码似乎没有运行。有人愿意帮忙吗?代码
解决方案
我没有使用实际的 Arduino SPI 库,但我会为您提供一个 Arduino 代码片段,它会 bitbang SPI 代替。它将允许您发送一些字节以查看是否一切正常。尝试另一种方法以查看它是否有效可能会很有用。您将需要更改引脚和寄存器以匹配您的目标应用程序。
#define PIN_SPIDATA 16
#define PIN_SPICLK 17
#define PIN_SPILOAD 18
#define REG_DECODEMODE 0x09
#define REG_INTENSITY 0x0A
#define REG_SCANLIMIT 0x0B
#define REG_SHUTDOWN 0x0C
#define REG_DISPLAYTEST 0x0F
void setup() {
// set ddr for sw spi pins
pinMode(PIN_SPICLK, OUTPUT);
pinMode(PIN_SPIDATA, OUTPUT);
pinMode(PIN_SPILOAD, OUTPUT);
setRegister(REG_INTENSITY, 0x04);
setRegister(REG_SCANLIMIT, 0x07);
setRegister(REG_SHUTDOWN, 0x01); // normal operation
setRegister(REG_DECODEMODE, 0x00); // pixels not integers
setRegister(REG_DISPLAYTEST, 0x00); // not in test mode
}
// sends a single byte by sw spi (no latching)
void putByte(uint8_t data)
{
uint8_t i = 8;
uint8_t mask;
while(i > 0) {
mask = 0x01 << (i - 1); // get bitmask
digitalWrite(PIN_SPICLK, LOW); // tick
if (data & mask){ // choose bit
digitalWrite(PIN_SPIDATA, HIGH); // set 1
}else{
digitalWrite(PIN_SPIDATA, LOW); // set 0
}
digitalWrite(PIN_SPICLK, HIGH); // tock
--i; // move to lesser bit
}
}
// sets register to the same byte value for all screens
void setRegister(uint8_t reg, uint8_t data)
{
digitalWrite(PIN_SPILOAD, LOW); // begin
for(uint8_t i = 0; i < numChips; ++i){
putByte(reg); // specify register
putByte(data); // send data
}
digitalWrite(PIN_SPILOAD, HIGH); // latch in data
digitalWrite(PIN_SPILOAD, LOW); // end
}
推荐阅读
- javascript - 如何删除 Highcharts 中单个图例的图例符号?
- javascript - 使用 localStorage 持久化数据 - React.js
- docker - 使用 ramdisk 更快地构建 Dockerfile
- html - 字符串为 11 个字符或更多时的 ESP/HTML 无效字符
- javascript - Angular 9 自定义样式/格式 HTML 文本区域
- sql - 如何在不知道 SQL 表有多少列的情况下向 SQL 表添加行
- c - malloc 是动态内存分配吗?
- python - 在后台删除 py.exe
- java - Java 并行 Streams 处理时间不匹配
- android - 如何从 Android 中的 AutocompleteSupportFragment 获取地点描述