一、前言

最近用到SPI,调试一下N76E003的SPI
首先下最新的BSP,旧的没SPI例程,我现在的是 N76E003_BSP_Keil_C51_V1.0.6
直接撸代码 SPI_Interrupt_Master

二、配置

  1. 硬件配置
    CSS:P15
    P10:SCLK
    P00:MOSI
    P01:MISO

  2. 配置
    关闭错误侦测
    CSS手动
    MSB First
    CPOL=0 空闲低电平
    CPHA=1 第一个沿(上升)发送数据,第二个沿(下降)采样
    时钟 DIV8 =16M/8=2M

三、程序

初始化

void SPI_Initial(void)
{P15_Quasi_Mode;                                                        // P15 (SS) Quasi modeP10_Quasi_Mode;                                                        // P10(SPCLK) Quasi modeP00_Quasi_Mode;                                                        // P00 (MOSI) Quasi modeP01_Quasi_Mode;                                                        // P22 (MISO) Quasi modeset_DISMODF;                                                            // 错误侦测关闭SS General purpose I/O ( No Mode Fault )clr_SSOE;                                                              //CSS自己不自动clr_LSBFE;                                                                // MSB firstclr_CPOL;                                                                // The SPI clock is low in idle modeset_CPHA;                                                                // The data is sample on the second edge of SPI clockset_MSTR;                                                                // SPI in Master modeSPICLK_DIV8;                                                            // Select SPI clockEnable_SPI_Interrupt;                                                    // Enable SPI interruptset_SPIEN;                                                                // Enable SPI function
}

中断,只有发送完成

//-----------------------------------------------------------------------------------------------------------
void SPI_ISR(void) interrupt 9                  // Vecotr @  0x4B
{clr_SPIF;spi_send_ok=1;// Timer3_Delay10us(1);
}

main中循环发送

//-----------------------------------------------------------------------------------------------------------
UINT8 test_data=0;
UINT8 spi_send_ok=1;
void main(void)
{UINT8 u8MID,u8DID;Set_All_GPIO_Quasi_Mode;InitialUART0_Timer1(115200);             /* 115200 Baud Rate*/SPI_Initial();printf ("\nSPI Start Transmit...\n");clr_SPIF;while(1){SS = 0;spi_send_ok=0;SPDR = test_data;while(!spi_send_ok);SS=1;test_data+=1;printf ("\r\n");P12=!P12;Timer0_Delay1ms(500);}#if 0Start_Sending_SPI(&u8MID,&u8DID);if((u8MID != 0x4F)&&(u8DID != 0x4E))SPI_Error();printf ("\nSPI Test OK!\n");while(1)                                    // SPI transmission finish{P12 = 1;Timer0_Delay1ms(500);P12 = 0;Timer0_Delay1ms(500);}#endif
}

逻辑分析波形 (我这里 MOSI 和MISO 选错了 懒得改了)

若连续发送3个数据 中间有3.8us的延迟

spi_send_ok=0;SPDR = test_data;                                // Send 0x90 to Slavewhile(!spi_send_ok);test_data+=1;spi_send_ok=0;SPDR = test_data;                                // Send 0x90 to Slavewhile(!spi_send_ok);test_data+=1;spi_send_ok=0;SPDR = test_data;                                // Send 0x90 to Slavewhile(!spi_send_ok);test_data+=1;spi_send_ok=0;SPDR = test_data;                                // Send 0x90 to Slavewhile(!spi_send_ok);test_data+=1;


若中断里面直接做连续发送,效果更差

void SPI_ISR(void) interrupt 9                  // Vecotr @  0x4B
{clr_SPIF;// spi_send_ok=1;if(test_data<10){SPDR = test_data++;}else{spi_send_ok=1;}// Timer3_Delay10us(1);
}
 SS = 0;spi_send_ok=0;SPDR = test_data++;while(1){if(spi_send_ok)SS=1;}


加上读取
这里就不在中断里面清除了

等读取了数据,再清除

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*///***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jan/21/2017
//***********************************************************************************************************//***********************************************************************************************************
//  File Function: N76E003 SPI in Master mode demo code
//***********************************************************************************************************#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"//***********************************************************************************************************
//  Application: SPI Function
//  Master send 0x90 and recevie 0x4E
//  Master send 0x01 and recevie 0x55
//  Master send 0x02 and recevie 0x56
//  Master send 0x03 and recevie 0x4F
//  Master send 0x04 and recevie 0x54
//
//  Master recevie 0x4E and 0x4F form slave after transmitting
//
//  Output : P1.4 & P2.1 flash when SPI pass
//           UART show result on hyper-terminal
//           P0.7 flash when SPI error
//***********************************************************************************************************#if 0
///*****************************************************************************************
//* For ADC INIT setting
//*****************************************************************************************/
//#define        SPICLK_DIV2            clr_SPR0;clr_SPR1
//#define        SPICLK_DIV4            set_SPR0;clr_SPR1
//#define        SPICLK_DIV8            clr_SPR0;set_SPR1
//#define        SPICLK_DIV16        set_SPR0;set_SPR1
//#define        Enable_SPI_Interrupt        set_ESPI;set_EA
//#define        SS        P15
#endifUINT8 spi_send_ok=1;//-----------------------------------------------------------------------------------------------------------
void SPI_Error(void)
{printf ("\nSPI error.\n");while(1)                                    // SPI error and P0.7 flash/{P07 = 1;Timer0_Delay1ms(500);P07 = 0;Timer0_Delay1ms(500);}
}
//-----------------------------------------------------------------------------------------------------------
void SPI_Initial(void)
{P15_Quasi_Mode;                                                        // P15 (SS) Quasi modeP10_Quasi_Mode;                                                        // P10(SPCLK) Quasi modeP00_Quasi_Mode;                                                        // P00 (MOSI) Quasi modeP01_Quasi_Mode;                                                        // P22 (MISO) Quasi modeset_DISMODF;                                                            // ½ûÖ¹´íÎóÕì²â SS General purpose I/O ( No Mode Fault )clr_SSOE;                                                           //CSS²»×Ô¶¯À­µÍ ×Ô¼ºÑ¡Ôñclr_LSBFE;                                                                // MSB firstclr_CPOL;                                                                // The SPI clock is low in idle modeset_CPHA;                                                                // The data is sample on the second edge of SPI clockset_MSTR;                                                                // SPI in Master modeSPICLK_DIV8;                                                            // Select SPI clockEnable_SPI_Interrupt;                                                    // Enable SPI interruptset_SPIEN;                                                                // Enable SPI function
}
//-----------------------------------------------------------------------------------------------------------
void Start_Sending_SPI(UINT8 *pu8MID,UINT8 *pu8DID)
{SS = 0;SPDR = 0x90;                                // Send 0x90 to SlavePCON |= SET_BIT0;                           // Enter idle modeif(SPDR != 0x4E)                            // Receive slave 1st DATASPI_Error();printf ("\nSlave Return %c!\n",SPDR);SPDR = 0x01;                                // Send 0x01 to SlavePCON |= SET_BIT0;                           // Enter idle modeif(SPDR != 0x55)                            // Receive slave 2nd DATASPI_Error();printf ("\nSlave Return %c!\n",SPDR);SPDR = 0x02;                                // Send 0x02 to SlavePCON |= SET_BIT0;                           // Enter idle modeif(SPDR != 0x56)                            // Receive slave 3rd DATASPI_Error();printf ("\nSlave Return %c!\n",SPDR);SPDR = 0x03;                                // Send 0x03 to SlavePCON |= SET_BIT0;                           // Enter idle modeif(SPDR != 0x4F)                            // Receive slave 4th DATASPI_Error();printf ("\nSlave Return %c!\n",SPDR);SPDR = 0x04;                                // Send 0x04 to SlavePCON |= SET_BIT0;                           // Enter idle modeif(SPDR != 0x54)                            // Receive slave 5th DATASPI_Error();printf ("\nSlave Return %c!\n",SPDR);SPDR = 0x4F;PCON |= SET_BIT0;                           // Enter idle mode*pu8MID = SPDR;                             // Receive Slave 1st DATA fron Slaveprintf ("\nSlave Return %c!\n",SPDR);SPDR = 0x4E;PCON |= SET_BIT0;                           // Enter idle mode*pu8DID = SPDR;                             // Receive Slave 2nd DATA from Slaveprintf ("\nSlave Return %c!\n",SPDR);SS = 1;
}void spi_send(uint8_t *tdata,uint8_t *rdata,uint8_t len)
{uint8_t i;uint8_t *p;SS=0;for(i=0;i<len;i++){spi_send_ok=0;SPDR = *(tdata+i); //轮训发送数据while(!spi_send_ok);//等待发送完成*(rdata+i)=SPDR;//接收数据clr_SPIF; //接收完了再清标志//printf ("data[%02x] %02x\r\n",i,rdata);// Timer3_Delay10us(10);}SS=1;
}//-----------------------------------------------------------------------------------------------------------uint8_t test_data_s[11]="0123456789";
uint8_t test_data_r[11]="";
void main(void)
{UINT8 u8MID,u8DID;Set_All_GPIO_Quasi_Mode;InitialUART0_Timer1(115200);             /* 115200 Baud Rate*/SPI_Initial();printf ("\nSPI Start Transmit...\n");clr_SPIF;while(1){spi_send(test_data_s,test_data_r,10);printf ("\r\n");P12=!P12;Timer0_Delay1ms(500);}#if 0Start_Sending_SPI(&u8MID,&u8DID);if((u8MID != 0x4F)&&(u8DID != 0x4E))SPI_Error();printf ("\nSPI Test OK!\n");while(1)                                    // SPI transmission finish{P12 = 1;Timer0_Delay1ms(500);P12 = 0;Timer0_Delay1ms(500);}#endif
}
//-----------------------------------------------------------------------------------------------------------
void SPI_ISR(void) interrupt 9                  // Vecotr @  0x4B
{//clr_SPIF;spi_send_ok=1;// Timer3_Delay10us(1);
}
//-----------------------------------------------------------------------------------------------------------

算力有限,8位数据中间27.5us的间隔

N76E003-SPI MASTER相关推荐

  1. MT7688 坑爹的 SPI Master 半双工全双工问题

    MTK的东西便宜是真的便宜,好用也相对比较好用,但是总有那么几个地方,让人用着心里就窝火,就MT76x8来说,第一个窝火的地方就是启动跳线选择,非得把串口用作启动跳线,导致调试起来非常麻烦,第二个就是 ...

  2. TMS320F28xx SPI master/slave example

    串行外设接口(SPI)是一个高速同步的串行输入/输出口.SPI的通信速率和通信数据长度都是可编程的,SPI通常用于DSP和外部外设及其他处理器之间的通信.主要用于显示驱动器.ADC及日历时钟等器件间接 ...

  3. spi master vhd timing

  4. SPI通信协议:单片机spi通信接口什么意思,spi接口干什么用的?

    讲真,以前做开发的时候最怕就是调spi和iic. 因为公司没有逻辑分析仪,调起来全凭经验,一出问题找都找不到,只能仔细看代码盲调,看是不是哪个时序有问题. 说到这里,可能刚初学的小伙伴会问:单片机sp ...

  5. 二十、SPI设备驱动及应用(一)

    先给出Linux SPI子系统的体系结构图: SPI子系统体系结构 下面开始分析SPI子系统. Linux中SPI子系统的初始化是从drivers/spi/spi.c文件中的spi_init函数开始的 ...

  6. SPI总线(一):基本原理篇

    相关文章: SPI总线(二):驱动分析篇 SPI总线(三):驱动实例 1.什么是SPI? SPI是串行外设接口(Serial Peripheral Interface)的缩写.是 Motorola 公 ...

  7. Linux SPI总线和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能: 1 ...

  8. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析

    PowerPC + Linux2.6.25平台下的SPI驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  9. 转载:Linux kernel SPI驱动解释

    From: http://www.cnblogs.com/liugf05/archive/2012/12/03/2800457.html 下面有两个大的模块: 一个是SPI总线驱动的分析        ...

最新文章

  1. 3、JPA一些常用的注解
  2. Python使用xlrd和xlwt读取和写入excel详细教程
  3. 根据map中某一字段排序
  4. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏的解决方案
  5. 局域网络连接的计算机不全,WIN10局域网电脑和设备显示不完整
  6. 领域应用 | 美团商品知识图谱的构建及应用
  7. 实践丨SpringBoot整合Mybatis-Plus项目存在Mapper时报错
  8. 【Elasticsearch】了解Elasticsearch写入磁盘的数据
  9. oracle exp不生成dumpfile,预估出实际导出文件的大小。
  10. 框架源码深入需要准备的知识之解析XML
  11. mac appium环境搭建
  12. Codeforces Round #444 (Div. 2)-贪心尺取-Ratings and Reality Shows
  13. 裴波那契数列及其递归算法
  14. Error:Module “./antd/es/badge/style“ does not exist in container. while loading “./antd/es/badge/sty
  15. 如何将D盘空间压缩并扩展C盘
  16. HC32L072 OPA 性能测试
  17. com.mysql.jdbc.PacketTooBigException: Packet for query is too large 异常解决办法
  18. iOS百思不得姐、ARKit、旋转动画、立体相册源码等
  19. Mysql—数据模型
  20. serverlet 原理_Serverlet详解 | 学步园

热门文章

  1. 【HTML】location对象
  2. 关于Java中writeObject方法
  3. 让文章吸引别人,更吸引自己!
  4. 区块链学习笔记(一)——区块链和搓麻是一样一样的
  5. UML系列文章(15)---构件
  6. Ceva XC架构介绍
  7. 迪士尼、无聊猿,与IP帝国的崛起
  8. 维沃手机有没有智能机器人_vivonex人工智能是什么
  9. 深入理解Kafka必知必会(1)
  10. maya前台渲染插件mel脚本工具