📄 595spi.c
字号:
/********************************************************
* Copyright (c) 2007,tianjin university andouwa *
* All rights reserved. *
*********************************************************
* 文件名称:595spi.c *
* 摘 要:arm用spi口控制数字电位器的函数定义 *
*********************************************************
* 当前版本:v0.1 *
* 作 者: 安豆娃 *
* 完成日期: *
********************************************************/
#include "config.h"
#define SPI_STOR_CLK (1<<21)
#define SPI_CLK (1<<22)
#define SPI_DATA (1<<23)
#define HC541A_EN (1<<24)
#define HC541B_EN (1<<25)
#define MODE_S 0x00100000 //485写数据使能端宏定义
#define UART0 0x00000005 //串口引脚功能宏定义
/* 定义串口模式设置数据结构 */
typedef struct UartMode
{ uint8 datab; // 字长度,5/6/7/8
uint8 stopb; // 停止位,1/2
uint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
}UARTMODE;
fp32 Tpclk = 11059200.0;
uint16 Cont1_freq;
uint16 Cont2_freq;
uint16 Cont3_freq;
uint16 Cont4_freq;
uint8 frenq[2];
/****************************************************************************
* 名称:RstWdt()
* 功能:看门狗喂狗操作。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void RstWdt(void)
{
WDFEED = 0xAA;
WDFEED = 0x55;
}
/*******************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
*******************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50; i++);
}
/****************************************************************************
* 名称:Initboard() 需要修改
* 功能:初始化板子 I/O口功能 方向
****************************************************************************/
void Initboard()
{
PINSEL0 = 0x000CC0C0; //四个中断引脚 具体的第二功能引脚及引脚方向在各自初始化化函数中完成
PINSEL1 = 0x00000001; //P0.16 P0.3 P0.7 P0.9
T0PR = 0; // 设置定时器0 为0分频
WDTC = 0xB9A000; // 设置WDTC,喂狗重装值 1s内没有给看门狗写数 就会复位!
WDMOD = 0x03; // 设置并启动WDT
RstWdt();
}
/****************************************************************************
* 名称:IRQ_Eint0()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint0(void)
{
static uint8 count = 0;
fp32 Tc_value;
if(count == 1)
{
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
}
else if(count == 2)
{
T0TCR = 0x00; // 停止T0TC
Tc_value = T0TC + 2.75;
Cont1_freq = (uint16)(Tpclk/Tc_value + 0.5);
count = 0;
// Eint0_flag = 1;
}
while( (EXTINT&0x01)!=0 ) //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)
{
EXTINT = 0x0F; // 清除EINT0中断标志
}
count++;
VICVectAddr = 0; // 向量中断结束 退出中断时必须
}
/****************************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint1(void)
{
static uint8 count = 0;
fp32 Tc_value;
if(count == 1)
{
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
}
else if(count == 2)
{
T0TCR = 0x00; // 停止T0TC
Tc_value = T0TC + 3.5;
Cont2_freq = (uint16)(Tpclk/Tc_value + 0.5);
count = 0;
// Eint1_flag = 1;
}
while( (EXTINT&0x02)!=0 ) //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)
{
EXTINT = 0x0F; // 清除EINT0中断标志
}
count++;
VICVectAddr = 0; // 向量中断结束 退出中断时必须
}
/****************************************************************************
* 名称:IRQ_Eint2()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint2(void)
{
static uint8 count = 0;
fp32 Tc_value;
if(count == 1)
{
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
}
else if(count == 2)
{
T0TCR = 0x00; // 停止T0TC
Tc_value = T0TC + 3.5;
Cont3_freq = (uint16)(Tpclk/Tc_value + 0.5);
count = 0;
// Eint2_flag = 1;
}
while( (EXTINT&0x04)!=0 ) //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)
{
EXTINT = 0x0F; // 清除EINT0中断标志
}
count++;
VICVectAddr = 0; // 向量中断结束 退出中断时必须
}
/****************************************************************************
* 名称:IRQ_Eint3()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint3(void)
{
static uint8 count = 0;
fp32 Tc_value;
if(count == 1)
{
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
}
else if(count == 2)
{
T0TCR = 0x00; // 停止T0TC
Tc_value = T0TC + 3.5;
Cont3_freq = (uint16)(Tpclk/Tc_value + 0.5);
count = 0;
// Eint3_flag = 1;
}
while( (EXTINT&0x08)!=0 ) //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)
{
EXTINT = 0x0F; // 清除EINT0中断标志
}
count++;
VICVectAddr = 0; // 向量中断结束 退出中断时必须
}
/*******************************************************************
Eint_init() 键盘初始化函数 对应的I/O口 P1.23-P1.25设置为输入
并设置使能相应的中断
参数: 无
********************************************************************/
void Eint_init()
{
EXTMODE = 0x00; // 设置EINT中断均为高电平触发模式
EXTPOLAR = 0x0F;
VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
VICVectCntl0 = 0x20|14; // 分配EINT0中断到向量中断1
VICVectCntl1 = 0x20|15; // 分配EINT0中断到向量中断2
VICVectCntl2 = 0x20|16; // 分配EINT0中断到向量中断3
VICVectCntl3 = 0x20|17; // 分配EINT0中断到向量中断4
VICVectAddr0 = (int)IRQ_Eint0; // 设置中断服务程序地址
VICVectAddr1 = (int)IRQ_Eint1; // 设置中断服务程序地址
VICVectAddr2 = (int)IRQ_Eint2; // 设置中断服务程序地址
VICVectAddr3 = (int)IRQ_Eint3; // 设置中断服务程序地址
EXTINT = 0x0F; // 清除EINT中断标志
// VICIntEnable = 0x0003C000; // 使能EINT中断
}
/****************************************************************************
* 名称:spiinit()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -