/****************************************Copyright (c)**************************************************** ** Guangzhou ZHIYUAN electronics Co.,LTD. ** ** http://www.embedtools.com ** **--------------File Info--------------------------------------------------------------------------------- ** File name: main.c ** Last modified Date: 2010-02-04 ** Last Version: V1.0 ** Descriptions: The main() function example template ** **-------------------------------------------------------------------------------------------------------- ** Created by: Lanwuqiang ** Created date: 2010-02-05 ** Version: V1.0 ** Descriptions: 添加用户应用程序 ** **-------------------------------------------------------------------------------------------------------- ** Modified by: ZhangNingbo ** Modified date: 2010-02-25 ** Version: V1.0 ** Descriptions: SPI0做主机_SPI1做从机示例程序 ** **-------------------------------------------------------------------------------------------------------- ** Modified by: ** Modified date: ** Version: ** Descriptions: ** ** Rechecked by: *********************************************************************************************************/ #include "..\config.h" /********************************************************************************************************* 宏定义 *********************************************************************************************************/ #define BEEP (1ul << 7) #define BEEP_INIT() GPIO2DIR |= BEEP /* 蜂鸣器初始化 */ #define BEEPOFF() GPIO2DATA |= BEEP /* 蜂鸣器关 */ #define BEEPON() GPIO2DATA &= ~BEEP /* 蜂鸣器开 */ volatile INT8U RcvFlag = 0; /* 接收到新数据标志 */ volatile INT8U RcvData = 0; /* 接收到的数据 */ volatile INT8U TestData = 0; /********************************************************************************************************* ** Function name: myDelay ** Descriptions: 软件延时 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void myDelay (INT32U ulTime) { INT32U i; i = 0; while (ulTime--) { for (i = 0; i < 5000; i++); } } /********************************************************************************************************* ** Function name: SPI1_Isr ** Descriptions: SPI1中断服务函数 ** input parameters: 无 ** output parameters: 无 *********************************************************************************************************/ void SPI1_Isr (void) { RcvData = SSP1DR; /* 接收数据 */ RcvFlag = 0x01; /* 接收到新数据 */ SSP1ICR = 0x03; /* 清除标志位 */ } /********************************************************************************************************* ** Function name: SPI0Master_Init() ** Descriptions: 将SPI控制器设置为主机SPI。 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void SPI0Master_Init (void) { PRESETCTRL |= 0x01; /* 禁止SPI0复位 */ IOCON_SCKLOC = 0x02; /* P0.6配置为SCK */ SYSAHBCLKCTRL |= (1ul << 11); /* 打开SPI0外设 */ SSP0CLKDIV = 0x01; /* SSP时钟分频 */ SSP0CR0 = (0x01 << 8) | /* SCR 设置SPI时钟分频 */ (0x01 << 7) | /* CPHA 时钟输出相位, */ /* 仅SPI模式有效 */ (0x01 << 6) | /* CPOL 时钟输出极性, */ /* 仅SPI模式有效 */ (0x00 << 4) | /* FRF 帧格式 00=SPI,01=SSI, */ /* 10=Microwire,11=保留 */ (0x07 << 0); /* DSS 数据长度,0000-0010=保留*/ /* 0011=4位,0111=8位,1111=16位 */ SSP0CR1 = (0x00 << 3) | /* SOD 从机输出禁能,1=禁止 */ (0x00 << 2) | /* MS 主从选择,0=主机,1=从机 */ (0x01 << 1) | /* SSE SSP使能 */ (0x00 << 0); /* LBM 回写模式 */ SSP0CPSR = 2; /* PCLK分频值 */ SSP0ICR = 0x03; /* 中断清除寄存器 */ } /********************************************************************************************************* ** Function name: SPI1Slave_Init() ** Descriptions: 将SSP控制器设置为主机SPI。 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void SPI1Slave_Init (void) { PRESETCTRL |= 0x04; /* 禁止SPI1复位 */ SYSAHBCLKCTRL |= (1ul << 18); /* 打开SPI1外设 */ SSP1CLKDIV = 0x01; /* SSP时钟分频 */ SSP1CR0 = (0x01 << 8) | /* SCR 设置SPI时钟分频 */ (0x00 << 7) | /* CPHA 时钟输出相位, */ /* 仅SPI模式有效 */ (0x01 << 6) | /* CPOL 时钟输出极性, */ /* 仅SPI模式有效 */ (0x00 << 4) | /* FRF 帧格式 00=SPI,01=SSI, */ /* 10=Microwire,11=保留 */ (0x07 << 0); /* DSS 数据长度,0000-0010=保留*/ /* 0011=4位,0111=8位,1111=16位 */ SSP1CR1 = (0x00 << 3) | /* SOD 从机输出禁能,1=禁止 */ (0x01 << 2) | /* MS 主从选择,0=主机,1=从机 */ (0x01 << 1) | /* SSE SSP使能 */ (0x00 << 0); /* LBM 回写模式 */ SSP1ICR = 0x03; /* 中断清除寄存器 */ SSP1IMSC = 0x02; /* 中断使能寄存器 */ zyIsrSet(NVIC_SSP1, (unsigned long)SPI1_Isr, PRIO_ONE); } /********************************************************************************************************* ** Function name: SPI0_SendData() ** Descriptions: SSP接口向SPI总线发送数据。 ** input parameters: data 待发送的数据 ** output parameters: 返回值为读取的数据 ** Returned value: 无 *********************************************************************************************************/ uint8 SPI0_SendData (uint8 data) { SSP0DR = data; while ((SSP0SR & 0x01) == 0) { /* 等待TFE置位,即发送FIFO空 */ } return(SSP0DR); } /********************************************************************************************************* ** Function name: main ** Descriptions: 当硬件基于EasyCortex M3—1300开发板时,SPI0作主机,SPI1作从机,连接P0.2与P2.0、 ** P0.6与P2.1、P0.8与P2.2、P0.9与P2.3连接 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ int main (void) { uint32 i; targetInit(); /* 初始化目标板,切勿删除 */ pinInit(); /* 引脚初始化 */ SYSAHBCLKCTRL |= (1ul << 6); BEEP_INIT(); BEEPOFF(); SPI0Master_Init(); SPI1Slave_Init(); for (i = 0; i < 8; i++) { RcvFlag = 0; /* 清除接收到新数据标志 */ TestData = SPI0_SendData(i); /* 发送显示数据 */ myDelay(100); /* 延时 */ if (RcvFlag != 0) { /* 如果接收到新数据 */ if (RcvData == i) { /* * 接收的数据是否与发送的数据相同,通讯无误,蜂鸣器响一次 */ BEEPON(); myDelay(100); BEEPOFF(); } else { /* * 数据错误,BEEP长鸣 */ BEEPON(); } } else { /* * 通讯出错,BEEP长鸣 */ BEEPON(); } } while (1); } /********************************************************************************************************* End Of File *********************************************************************************************************/