微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ATmega16 单片机SPI的问题

ATmega16 单片机SPI的问题

时间:10-02 整理:3721RD 点击:
大神们,帮看看这个程序哪里有问题!为什么烧进单片机中两个机器却不能通信!
Master ;

  1. #include <mega16.h>
  2. #include <delay.h>
  3. void PortInit(void){
  4.     DDRB    = 0XBF;
  5.     PORTB    = 0X00;
  6. }

  7. void SPI_Init(void){
  8.     SPCR     = 0x51;      
  9. }

  10. void SPI_Send(unsigned char ch){
  11.     SPDR = ch;
  12.     while(!(SPSR & (1<<SPIF)));
  13. }

  14. void MCU_Init(void){
  15.     PortInit();
  16.     SPI_Init();
  17. }

  18. void main(void){
  19.     MCU_Init();
  20.     while(1){
  21.         SPI_Send('C');
  22.         delay_ms(1000);
  23.     }   
  24. }

复制代码

Slave:

  1. #include <mega16.h>
  2. #include <stdio.h>

  3. void PortInit(void){
  4.         DDRB        = 0X4F;
  5.         PORTB        = 0X0f;
  6.         DDRD        = 0X02;
  7.         PORTD        = 0XFF;
  8. }

  9. void uart_init(void){
  10.     UCSRB = 0X00;        //禁止发送与接收
  11.     UCSRA = 0X82;        //倍速
  12.     UCSRC = 0X06;        //8位数据位
  13.     UBRRL = 0X67;        //波特率9600
  14.     UBRRH = 0X00;
  15.     UCSRB = 0X98;
  16. }

  17. void SPI_Init(void){
  18.         SPCR        = 0X41;
  19.         //SPSR        = 0x41;       
  20. }

  21. unsigned char SPI_Rec_Data(void){
  22.         unsigned char tmp = 0;
  23.         while(!(SPSR&(1<<SPIF)));
  24.         tmp = SPDR;
  25.         return tmp;
  26. }

  27. void MCU_Init(void){
  28.         PortInit();
  29.         uart_init();
  30.         SPI_Init();
  31. }

  32. void main(){
  33.         unsigned char tmp = 0;
  34.         MCU_Init();
  35.         while(1){   
  36.                 tmp = SPI_Rec_Data();
  37.                 SPSR &= ~(1<<SPIF);
  38.                 printf("%c", tmp);
  39.                 PORTB = 0X00;
  40.         }
  41. }

复制代码


硬件电路是将单片机的PB4~7 相互连接的!找了好久百度,都没有结果!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top