📄 595spi.c
字号:
* 功能:初始化SPI接口,设置为主机。主要是设置SPI口的方向
* 入口参数:无
* 出口参数:无
****************************************************************************/
void spiinit(void)
{
IO1DIR |= SPI_STOR_CLK;
IO1DIR |= SPI_CLK;
IO1DIR |= SPI_DATA;
IO1DIR |= HC541A_EN;
IO1DIR |= HC541B_EN;
}
/****************************************************************************
* SendData(uint32 data)
* 功能:
* 入口参数:data 要发送的数据
num 要控制的电位器编号
* 出口参数:无
* 说明: 发送数据时,高位先发送。
****************************************************************************/
void SendData(uint32 data)
{
uint8 i = 0;
IO1CLR = SPI_STOR_CLK;
for(i=0; i<24; i++) // 发送24位数据
{
IO1CLR = SPI_CLK; // SPI_CLK = 0
if( (data & 0x0001)!=0 ) //设置SPI_DATA输出值
IO1CLR = SPI_DATA;
else
IO1SET = SPI_DATA;
data >>= 1;
IO1SET = SPI_CLK; // SPI_CLK = 1
}
IO1SET = SPI_STOR_CLK;
}
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送一个字节数据。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void sendbyte(uint8 data)
{
U0THR = data; // 发送数据
}
/****************************************************************************
* 名称:sendcomand()
* 功能:ARM向430板要求发送数据命令
* 入口参数:无
* 出口参数:无
****************************************************************************/
void sendfreq(void)
{
uint8 i;
IO0SET = MODE_S; //要发送数据
for(i=0; i<2; i++)
sendbyte(frenq[i]);
while( (U0LSR&0x40)==0 ); // 等待数据发送 这里可以调用操作系统的延时函数代替
IO0CLR = MODE_S; //等待接收数据
}
/****************************************************************************
* 名称: uart_set(uint32 baud, UARTMODE set)
* 功能: 串口0参数设置,设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初始化成功,为0表示参数出错
****************************************************************************/
uint8 uart_set(uint32 baud, UARTMODE set)
{
uint32 bak;
if( (0==baud)||(baud>115200) ) //参数过滤
return(0);
if( (set.datab<5)||(set.datab>8) )
return(0);
if( (0==set.stopb)||(set.stopb>2) )
return(0);
if( set.parity>4 )
return(0);
U0LCR = 0x80; // 设置串口波特率 DLAB位置1
bak = (Fpclk>>4)/baud;
U0DLM = bak>>8;
U0DLL = bak&0xff;
bak = set.datab-5; // 设置串口模式 设置字长度
if(2 == set.stopb)
bak |= 0x04; // 判断是否为2位停止位
if(0!=set.parity)
{
set.parity = set.parity-1;
bak |= 0x08;
}
bak |= set.parity<<4; // 设置奇偶校验
U0LCR = bak;
// U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节
return(1);
}
/****************************************************************************
* 名称:uart_init()
* 功能:设置波特率,设置I/O口功能
* 入口参数:无
* 出口参数:无
****************************************************************************/
void uart_init()
{
UARTMODE uart0_set;
PINSEL0 |= UART0; // 设置I/O连接到UART0
IO0DIR |= MODE_S; // 设置TRE控制口为输出
uart0_set.datab = 8; // 8位数据位
uart0_set.stopb = 1; // 1位停止位
uart0_set.parity = 0; // 无奇偶校验
uart_set(9600, uart0_set); // 初始化串口模式
}
/****************************************************************************
* uint32 Data_in(void)
* 功能:
* 入口参数:data 要发送的数据
num 要控制的电位器编号
* 出口参数:无
* 说明: 发送数据时,高位先发送。
****************************************************************************/
uint32 Data_in(void)
{
uint32 datainput = 0xffffffff;
datainput |= ((IO0PIN<<2)&0x00000010);
datainput &= ((IO0PIN<<2)|0xFFFFFFEF);
datainput |= ((IO0PIN<<1)&0x000000E0);
datainput &= ((IO0PIN<<1)|0xFFFFFF1F);
IO1SET = HC541B_EN;
IO1CLR = HC541A_EN;
DelayNS(100);
datainput |= (IO0PIN>>11)&0x00000F00;
datainput &= (IO0PIN>>11)|0xFFFFF0FF;
datainput |= (IO0PIN>>15)&0x0000F000;
datainput &= (IO0PIN>>15)|0xFFFF0FFF;
DelayNS(100);
IO1SET = HC541A_EN;
IO1CLR = HC541B_EN;
DelayNS(100);
datainput |= (IO0PIN>>3)&0x000F0000;
datainput &= (IO0PIN>>3)|0xFFF0FFFF;
datainput |= (IO0PIN>>7)&0x00F00000;
datainput &= (IO0PIN>>7)|0xFF0FFFFF;
return datainput;
}
/****************************************************************************
* 名称:main()
* 功能:调用响应函数 完成响应功能
* 参数:无
****************************************************************************/
int main(void)
{
uint8 i = 0;
uint32 datain = 0;
Initboard(); //初始化板子 I/O口功能 方向
spiinit(); //SPI接口控制AD8402初始化
uart_init();
Eint_init();
RstWdt();
while(1)
{
RstWdt();
EXTINT = 0x0F; // 清除EINT中断标志
VICIntEnable = 0x00004000; // 使能EINT中断
DelayNS(50000);
VICIntEnClr = 0x00004000;
RstWdt();
EXTINT = 0x0F; // 清除EINT中断标志
VICIntEnable = 0x00008000; // 使能EINT中断
DelayNS(50000);
VICIntEnClr = 0x00008000;
RstWdt();
EXTINT = 0x0F; // 清除EINT中断标志
VICIntEnable = 0x00010000; // 使能EINT中断
DelayNS(50000);
VICIntEnClr = 0x00010000;
RstWdt();
EXTINT = 0x0F; // 清除EINT中断标志
VICIntEnable = 0x00020000; // 使能EINT中断
DelayNS(50000);
VICIntEnClr = 0x00020000;
RstWdt();
datain = Data_in();
SendData(datain);
DelayNS(50000);
frenq[0] = (uint8)(Cont1_freq&0x00FF);
frenq[1] = (uint8)((Cont1_freq>>8)&0x00FF);
sendfreq();
for(i=0; i<24; i++)
{
datain = (1<<i);
SendData(datain);
DelayNS(10000);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -