学习《AVR单片机与传感器模块设计》(IAR) 教材,ATMega16 的SPI 双机通信 编程实践
编程通过 但是仿真 无数据传输 请求指导
单片机源程序如下:
- //主机端:
- #include <ioavr.h>
- #include "delay.h"
- //#include <iom16.h>
- //========================变量类型的宏定义=========================
- #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<<SPE)|(1<<MSTR)|(1<<SPR0); //使能SPI主机模式,设置时钟速率为fck/16
- }
- //==================主机发送一字节数据子程序=======================
- void SPI_MasterTransmit(char cData) //主机状态下的数据传输
- {
- SPDR = cData; //启动数据传输
- while(!(SPSR & (1<<SPIF))); //查询等待传输结束
- }
- //=============================主函数============================
- 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转换数据
- }
复制代码
|