|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
学习《AVR单片机与传感器模块设计》(IAR) 教材,ATMega16 的SPI 双机通信 编程实践! g* F3 E; y/ a9 P5 N" z
编程通过,但是仿真,无数据传输,请求指导。
, ?4 o; p/ o c, S( K! F" u7 f6 c
6 O0 @, I3 G; L6 H" _( k/ t& n3 }9 a0 c/ V; G
- //主机端:
- #include
- #include "delay.h"
- //#include
- //========================变量类型的宏定义=========================
- #define uchar unsigned char
- #define uint unsigned int
- //=========================SPI宏定义==============================
- #define DDR_SPI DDRB
- #define PORT_SPI PORTB
- #define CSN PORTB_Bit4
- #define MOSI PORTB_Bit5
- #define MISO PORTB_Bit6
- #define SCK PORTB_Bit7
- //=========================晶振宏定义===========================
- #define xtal 8 //8MHz晶振
- uchar vol; //存储电压的全局变量
- //=========================端口初始化子程序=======================
- void Port_Init(void)
- {
- DDRA = 0x00; PORTA = 0xFF; //PORTA初始化为悬浮输入
- DDRB = 0xFF; PORTB = 0xFF;
- DDRC = 0xFF; PORTC = 0xFF;
- DDRD = 0xFF; PORTD = 0xFF;
- }
- //=========================ADC初始化=============================
- void Adc_Init(void)
- {
- ADCSRA = 0xEE; //使能ADC、开始转换、自动触发、使能中断、64预分频
- ADMUX = 0x40; //使用AVCC做基准电压源、数据格式为右对齐、选择通道0
- }
- //============================A/D转换============================
- unsigned int ADC_Convert(void)
- {
- uint temp1,temp2;
- temp1 = (unsigned int)ADCL; //先读取低8位数据
- temp2 = (unsigned int)ADCH; //再读取高8位数据
- temp2 = (temp2<<8)+temp1; //高8位左移两位与低8位合并成10位数据
- return(temp2); //返回合并后的值
- }
- //===========================数据转换=============================
- unsigned int Conv(unsigned int i)
- {
- long x;
- uint y;
- x = (4840*(long)i)/1023; //把变量转化成需要显示的形式
- y = (unsigned int)x; //把无符号长整型变量强制转换成无符号整型变量
- return y; //返回转换后的值
- }
- //=========================主机初始化子程序=======================
- void SPI_MasterInit(void) //主机状态下的SPI初始化
- {
- MOSI = 1; //设置MOSI为输出
- MISO = 0; //设置MISO为输入
- SCK = 1; //设置SCK为输出
- CSN = 1; //设置CSN为输出
- SPCR = (1<
- }
- //==================主机发送一字节数据子程序=======================
- void SPI_MasterTransmit(char cData) //主机状态下的数据传输
- {
- SPDR = cData; //启动数据传输
- while(!(SPSR & (1<
- }
- //=============================主函数============================
- void main(void)
- {
- Port_Init(); //端口初始化
- Adc_Init(); //A/D转换初始化
- SPI_MasterInit(); //初始化为主机
- CSN=0; //选择从机
- SREG = 0x80; //打开全局中断
- while(1)
- {
- SPI_MasterTransmit(vol); //发送电压数据
- _delay_ms(10);
- }
- }
- //====================中断函数(A/D转换结束中断)====================
- #pragma vector = ADC_vect
- __interrupt void ADC_Server(void)
- {
- vol = Conv(ADC_Convert()); //获取A/D转换数据
- }
-
7 C7 k- [( |) }! i
% `, B+ N, o/ L: o) K! r
7 I$ j1 Q! W! z6 x
|
|