//这个是“ARM Corte-M3内核微控制器快速入门与应用”书中的一个作者总结的头文件,
// 为了提高朋友们的学习效率和缩短学习时间,而整理的一个SSI通信程序的头文件共使用,取名为:lm101_ssi.h 。这样就不用去考虑细节的问题,直接调用文件中的函数便可;
//下面是lm101_ssi.h文件的全部内容
#include "hw_memmap.h"
#include "hw_types.h"
#include "ssi.h"
#include "gpio.h"
#include "sysctl.h"
#include "systick.h"
#define BitRate 2400 //115200 // 设定波特率
#define DataWidth 8 // 设定数据宽度
// 此表为7段数码管显示0~F的字模
unsigned char DISP_TAB[16] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
//-----------------------------------------------------------------------------
//下面是外用程序
//-----------------------------------------------------------------------------
// 函数名称:Lm101_Ssi_Initi(void)
// 函数功能:启用SSI通信模块
// 入口参数:无
// 输出参数:无。
//说明:连线时PA5为MOSI发送数据引脚, PA4为MISO接收数据引脚,PA3为/SS片选引脚,PA2为SCL时钏引脚
//-------------------------------------------------------------------------------
void Lm101_Ssi_Initi(void)
{
// 使能 SSI 即启动外设SSI通信系统
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI);
// 起用 GPIO PA 口 用以SSi同步串行输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// 配置 SSI SSI_FRF_MOTO_MODE_0设为SPI通信格式 设为主工作模式 115200 8位数据宽度
SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, BitRate, DataWidth);
// 使能 SSI 起动SSI通信
SSIEnable(SSI_BASE);
// 设定 GPIO A 2~5 引脚为使用外设功能 GPIO_DIR_MODE_HW由硬件进行控制
GPIODirModeSet(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 |
GPIO_PIN_5), GPIO_DIR_MODE_HW);
}
//-----------------------------------------------------------------------------
// 函数名称:Lm101_Ssi_NB_Send()
// 函数功能:一次发出多个字符
// 入口参数:lpchData[待发送的数据缓存区,可以用数组将数据传过来],nCount[待发送数据的个数]
// 输出参数:无。
//------------------------------------------------------------------------
void Lm101_Ssi_NB_Send(unsigned char *lpchData,unsigned int nCount)
{
unsigned int i=0;
for (i=0; i<nCount; i++)
{
// 循环输出 0~F 的字模
SSIDataPut(SSI_BASE, lpchData[i]);
}
}
//----------------------------------------------------------------------------
// 函数名称:Lm101_Ssi_Send()
// 函数功能:用于一次发出单个字符
// 入口参数:uchC[待发送的字符]
// 输出参数:无。
//---------------------------------------------------------------------------
void Lm101_Ssi_Send(unsigned char uchC)
{
SSIDataPut(SSI_BASE, uchC);
}
//-----------------------------------------------------------------------------
// 函数名称:Lm101_Ssi_Rcv()
// 函数功能:用于用于读出一个字符[接收数据]
// 入口参数:无
// 输出参数:uchCb[读出的单个字符]
//----------------------------------------------------------------------------
unsigned char Lm101_Ssi_Rcv()
{
unsigned char uchCb;
unsigned long nlStr=0;
SSIDataGet(SSI_BASE, &nlStr);
uchCb=nlStr;
return uchCb;
}
//-----------------------------------------------------------------------------
//******************************************************************************
//下面是一个具体的ssi的例子
//SSI同步串行发送
//文件夹:LM101_SSI
//*********************************************************************************
#include "lm101_ssi.h" // 上面提到的头文件;
#define PB4_LED GPIO_PIN_4
#define PB5_LED GPIO_PIN_5
#define PB6_LED GPIO_PIN_6
//-----------------------------------------------------------------------------------------------------
// 防止JTAG失效
//----------------------------------------------------------------------------------------------------
void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
// 设置KEY所在管脚为输入
GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_3, GPIO_DIR_MODE_IN);
// 如果复位时按下KEY,则进入
if ( GPIOPinRead( GPIO_PORTB_BASE , GPIO_PIN_3) == 0x00 )
{
for (;;); // 死循环,以等待JTAG连接
}
// 禁止KEY所在的GPIO端口
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOB);
}
//-----------------------------------------------------------------------------------
//延时子程序
//------------------------------------------------------------------------------------
void delay(int d)
{
int i=0;
for( ; d; --d)
for(i=0;i<10000;i++);
}
//----------------------------------------------------------------------------------
// 函数名称 GPio_Initi
// 函数功能 启动外设GPIO输入输出
// 输入参数 无。
// 输出参数 无。
//------------------------------------------------------------------------------------
void GPio_Initi(void)
{
// 使能GPIO B口外设。用于指示灯
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );
//设定PB4 PB5为输出用做指示灯点亮
GPIODirModeSet(GPIO_PORTB_BASE, PB4_LED | PB5_LED | PB6_LED,GPIO_DIR_MODE_OUT);
//初始化PB4 PB5为低电平点亮指示灯
GPIOPinWrite( GPIO_PORTB_BASE, PB5_LED, 0 );
//设置PA口用作按键功能
// SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// 设置KEY所在管脚为输入(PA0~PA1)
// GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_0|GPIO_PIN_1, GPIO_DIR_MODE_IN);
}
//------------------------------------------------------------------------------------
int main()
{
unsigned char nJsq=0,chS[3];
//防止JTAG失效
delay(10);
jtagWait();
delay(10);
// 设定系统晶振为时钟源。
SysCtlClockSet( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ );
GPio_Initi(); //起动GPIO输出
Lm101_Ssi_Initi(); //起动串行发送子程序
Lm101_Ssi_Send(0xA4); //复位ZLG7289
delay(100); //
while(1)
{
chS[0]=0x80;
chS[1]=nJsq;
Lm101_Ssi_NB_Send(chS,2);
nJsq++;
if(nJsq>9)nJsq=0;
//程序运行指示灯处理
if(GPIOPinRead(GPIO_PORTB_BASE, PB5_LED)==0x00) //读出PB5_LED引脚值判断是否为0
GPIOPinWrite(GPIO_PORTB_BASE, PB5_LED,0x20); //如果PB5引脚为0就给其写1 熄灯
else GPIOPinWrite(GPIO_PORTB_BASE, PB5_LED,0x00); //就给写0 亮灯
delay(30);
}
}
//--------------------------------------------------------------------------