找回密码
 注册
查看: 282|回复: 4
打印 上一主题 下一主题

求助 iar for avr单片机编程通过, 仿真 SPI无数据传输 请求指导

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-12-16 10:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2022-12-16 11:25 | 只看该作者
这两个单片机都需要进行编程,一个作为主机,一个作为从机,并且两个MCU间需要有相应的通信机制,比如说从机收到,回复主机一个数据。

该用户从未签到

3#
发表于 2022-12-16 13:18 | 只看该作者
《AVR单片机与传感器模块设计》(IAR) 这本教材书,ATmega16 的SPI 双机通信 编程实践 例程  - \  s1 l; B/ U7 Y
显示最大值 0x1388    现在是 0xE3   227- X2 _8 _0 V0 L! U
A/D转换 没有问题, 单机 A/D 编程 显示正确  SPI通信程序

该用户从未签到

4#
发表于 2022-12-16 14:08 | 只看该作者
这个要设置主机模式还是从机模式的。

该用户从未签到

5#
发表于 2022-12-16 14:12 | 只看该作者
编程通过只能说明没有语句错误,程序要是有问题肯定就不成了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-5-30 08:17 , Processed in 0.093750 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表