📄 spi functions - spi 函数.txt
字号:
/* AD 转换使用AD7896 与AT90S8515 使用SPI 总线相连
MCU:AT90S8515
内存模式:SMALL
数据堆栈:128 字节
晶振频率:4MHz
AD7896与AT90S8515 的连接:
[AD7896] - [AT9S8515 DIP40]
1 Vin
2 Vref=5V
3 AGND - 20 GND
4 SCLK - 8 SCK
5 SDATA - 7 MISO
6 DGND - 20 GND
7 CONVST - 2 PB1
8 BUSY - 1 PB0
2x16 的字符型LCD接在PORTC:
[LCD] - [AT90S8515 DIP40]
1 GND - 20 GND
2 +5V - 40 VCC
3 VLC
4 RS - 21 PC0
5 RD - 22 PC1
6 EN - 23 PC2
11 D4 - 25 PC4
12 D5 - 26 PC5
13 D6 - 27 PC6
14 D7 - 28 PC7 */
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h> // 包含LCD头文件
#include <spi.h> // 包含SPI 头文件
#include <90s8515.h>
#include <stdio.h>
#include <delay.h>
// AD7896参考电压[mV]
#define VREF 5000L
// AD7896控制信号
#define ADC_BUSY PINB.0
#define NCONVST PORTB.1
// LCD显示缓存
char lcd_buffer[33];
unsigned read_adc(void)
{unsigned result;
// 开启采样模式1(高速采样)
NCONVST=0;
NCONVST=1;
// 等待采样完成
while (ADC_BUSY);
// 通过SPI 读MSB
result=(unsigned) spi(0)<<8;
//通过SPI 读LSB 并与MSB 合并
result|=spi(0);
// 计算采样电压[mV]
result=(unsigned) (((unsigned long) result*VREF)/4096L);
// 返回测量值
return result;
}
void main(void)
{// 初始化PORTB
// PB.0 输入,接AD7896 忙信号(BUSY)
// PB.1 输出,接AD7896 启动采样(/CONVST)
// PB.2 ,PB.3 输入
// PB.4 输出(SPI /SS)
// PB.5 输入
// PB.6 输入(SPI MISO)
// PB.7 输出(SPI SCLK)
DDRB=0x92;
// 初始化SPI 在主机模式
// 不需要中断,MSB 先发送,时钟极性负, SCK空闲时为低
// SCK=fxtal/4
SPCR=0x54;
// AD7896工作在模式1(高速采样)
// /CONVST=1, SCLK=0
PORTB=2;
// 初始化LCD
lcd_init(16);
lcd_putsf("AD7896 SPI bus\nVoltmeter");
delay_ms(2000);
lcd_clear();
// 读并显示ADC 输入电压
while (1)
{
sprintf(lcd_buffer,"Uadc=%4umV",read_adc());
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(100);
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -