使用之前还是有点担心难度稍微高一点,一晚上搞不定。但是,实际尝试下来不得不给Arduino点个赞,库开发的确实是比较成熟。
首先确认了硬件资源的使用:
实践中发现,其实片选的资源相对来说是灵活的,只需要是GPIO即可。实际的测试中,至少Arduino的库中片选并不是自动控制的。
核心代码如下:
#include <avr/sleep.h>
#include "timer.h"
#include "serial.h"
#include "task.h"
#include <SPI.h>
static uint8_t led_value = 0;
const int SPI_CS_PIN = 10;
void setup()
{
// put your setup code here, to run once:
// disable interrupt
cli();
SerialCfg_Init();
// LED configuration
pinMode(LED_BUILTIN, OUTPUT);
TaskTimer_Init();
// enable interrupt
SPI.begin();
SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
sei();
}
void loop()
{
}
void LedToggle(void)
{
if(led_value == 0)
{
digitalWrite(LED_BUILTIN, LOW);
led_value = 1;
}
else
{
digitalWrite(LED_BUILTIN, HIGH);
led_value = 0;
}
}
void spi_test_task_100ms(void)
{
uint8_t spi_data_8bit = 0x77;
uint16_t spi_data_16bit = 0x77AB;
digitalWrite(SPI_CS_PIN, LOW);
SPI.transfer(spi_data_8bit);
SPI.endTransaction();
digitalWrite(SPI_CS_PIN, LOW);
SPI.transfer16(spi_data_16bit);
SPI.endTransaction();
digitalWrite(SPI_CS_PIN, HIGH);
}
为了节省时间,多余的代码不进行删除了。之所以带有很多冗余的代码以及模块引用,主要是因为想利用之前实现的一个任务调度。
任务调度中增加调度:
void task_100ms(void)
{
spi_test_task_100ms();
}
基本上的测试代码就是上面的内容,看一下测试效果:
- 1M波特率的时钟
其实不准确,手册中也说了,其实SPI的波特率不能够百分百准确,但是会帮你自动选择一个贴近准确的数值。
- 500K的波特率
- 8bit的输出(0x77)
- 16bit的时钟
- 片选(其实,这个就是一个IO的控制)
- 16bit的MOSI(0x77AB)
- 8bit以及16bit输出
没有一个外设芯片,暂时测试了这么多,大致的功能看上去是实现了的。另外需要说明的是波形,或许本身的波形还是很规矩的,我的示波器是一个虚拟示波器,效果确实一般。