从机 STC8H8K64U 9.62实验箱
#include "config.h" //默认已包含stdio.h、intrins.h等头文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
uint8_t spi = 0;
uint8_t spi_f,spi_j;
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
spi_f = 0X99;
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
USBLIB_OUT_Done(); //查询方式处理USB接收的数据
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
SPDAT = spi_f;//需发送数据
while(!(SPSTAT & 0X80));//等待主机发送指令
SPSTAT &= ~0X80;//清标志
spi_j = SPDAT;//接收数据
if(spi_j == 0X55)
{
spi_j = 0X00;//翻转一次
P6 = ~P6;
}
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
//<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
// 在此添加用户预初始化代码
//<<AICUBE_USER_PREINITIAL_CODE_END>>
PORT2_Init(); //P2口初始化
PORT3_Init(); //P3口初始化
PORT4_Init(); //P4口初始化
PORT5_Init(); //P5口初始化
PORT6_Init(); //P6口初始化
CLK_Init(); //时钟模块初始化
SPI_Init(); //SPI初始化
delay_ms(1);
USBLIB_Init(); //USB库初始化
delay_ms(1);
//<<AICUBE_USER_INITIAL_CODE_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_INITIAL_CODE_END>>
EnableGlobalInt(); //使能全局中断
}
////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
do
{
NOP(14); //(MAIN_Fosc + 500000) / 1000000 - 10
} while (--us);
}
////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 10000;
while (--i);
} while (--ms);
}
////////////////////////////////////////
// P2口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT2_Init(void)
{
SetP2nInitLevelHigh(PIN_ALL); //设置P2初始化电平
SetP2nQuasiMode(PIN_ALL); //设置P2为准双向口模式
DisableP2nPullUp(PIN_ALL); //关闭P2内部上拉电阻
EnableP2nSchmitt(PIN_ALL); //使能P2施密特触发
SetP2nSlewRateNormal(PIN_ALL); //设置P2一般翻转速度
SetP2nDrivingNormal(PIN_ALL); //设置P2一般驱动能力
SetP2nDigitalInput(PIN_ALL); //使能P2数字信号输入功能
//<<AICUBE_USER_PORT2_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_PORT2_INITIAL_END>>
}
////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
SetP3nInitLevelHigh(PIN_ALL); //设置P3初始化电平
SetP3nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //设置P3.7,P3.6,P3.5,P3.4,P3.3,P3.2为准双向口模式
SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式
EnableP3nPullUp(PIN_5 | PIN_4); //使能P3.5,P3.4内部上拉电阻
DisableP3nPullUp(PIN_7 | PIN_6 | PIN_3 | PIN_2 | PIN_1 | PIN_0); //关闭P3.7,P3.6,P3.3,P3.2,P3.1,P3.0内部上拉电阻
EnableP3nSchmitt(PIN_ALL); //使能P3施密特触发
SetP3nSlewRateNormal(PIN_ALL); //设置P3一般翻转速度
SetP3nDrivingNormal(PIN_ALL); //设置P3一般驱动能力
SetP3nDigitalInput(PIN_ALL); //使能P3数字信号输入功能
//<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_PORT3_INITIAL_END>>
}
////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
SetP4nInitLevelHigh(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1); //设置P4.7,P4.6,P4.5,P4.4,P4.3,P4.2,P4.1初始化电平
SetP4nInitLevelLow(PIN_0); //设置P4.0初始化电平
SetP4nQuasiMode(PIN_ALL); //设置P4为准双向口模式
DisableP4nPullUp(PIN_ALL); //关闭P4内部上拉电阻
EnableP4nSchmitt(PIN_ALL); //使能P4施密特触发
SetP4nSlewRateNormal(PIN_ALL); //设置P4一般翻转速度
SetP4nDrivingNormal(PIN_ALL); //设置P4一般驱动能力
SetP4nDigitalInput(PIN_ALL); //使能P4数字信号输入功能
//<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_PORT4_INITIAL_END>>
}
////////////////////////////////////////
// P5口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT5_Init(void)
{
SetP5nInitLevelHigh(PIN_ALL); //设置P5初始化电平
SetP5nQuasiMode(PIN_ALL); //设置P5为准双向口模式
DisableP5nPullUp(PIN_ALL); //关闭P5内部上拉电阻
EnableP5nSchmitt(PIN_ALL); //使能P5施密特触发
SetP5nSlewRateNormal(PIN_ALL); //设置P5一般翻转速度
SetP5nDrivingNormal(PIN_ALL); //设置P5一般驱动能力
SetP5nDigitalInput(PIN_ALL); //使能P5数字信号输入功能
//<<AICUBE_USER_PORT5_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_PORT5_INITIAL_END>>
}
////////////////////////////////////////
// P6口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT6_Init(void)
{
SetP6nInitLevelHigh(PIN_ALL); //设置P6初始化电平
SetP6nQuasiMode(PIN_ALL); //设置P6为准双向口模式
DisableP6nPullUp(PIN_ALL); //关闭P6内部上拉电阻
EnableP6nSchmitt(PIN_ALL); //使能P6施密特触发
SetP6nSlewRateNormal(PIN_ALL); //设置P6一般翻转速度
SetP6nDrivingNormal(PIN_ALL); //设置P6一般驱动能力
SetP6nDigitalInput(PIN_ALL); //使能P6数字信号输入功能
//<<AICUBE_USER_PORT6_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_PORT6_INITIAL_END>>
}
////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
CLK_SYSCLK_Divider(10); //切换主时钟前先将系统时钟降频
HIRC_24M(); //选择内部预置的频率
CLK_MCLK_HIRC(); //选择内部高精度HIRC作为主时钟
CLK_MCLK2_BYPASS(); //旁路MCLK2,直接使用MCLK选择
CLK_SYSCLK_Divider(1); //设置系统时钟分频系数
//<<AICUBE_USER_CLOCK_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_CLOCK_INITIAL_END>>
}
////////////////////////////////////////
// SPI初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SPI_Init(void)
{
SPI_SwitchP2n(); //选择SPI数据口: SS(P2.2), MOSI(P2.3), MISO(P2.4), SCLK(P2.5)
SPI_SlaveMode(); //设置SPI为从机模式
SPI_UnignoreSS(); //从机模式设置CPHA为0时,SS脚脚一定不能忽略(必须SSIG=0)
SPI_DataMSB(); //设置SPI数据顺序为MSB (高位在前)
SPI_SetMode0(); //设置SPI工作模式0 (CPOL=0, CPHA=0)
SPI_SetClockDivider4(); //设置SPI时钟分频
SPI_Enable(); //使能SPI功能
//<<AICUBE_USER_SPI_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_SPI_INITIAL_END>>
}
////////////////////////////////////////
// SPI主机模式发送字节函数
// 入口参数: dat (待发送的字节数据)
// 函数返回: 无
////////////////////////////////////////
void SPI_WriteByte(uint8_t dat)
{
SPI_SendData(dat); //触发主机发送数据
while (!SPI_CheckFlag()); //等待发送完成
SPI_ClearFlag(); //清除中断标志
}
////////////////////////////////////////
// SPI主机模式读取字节函数
// 入口参数: 无
// 函数返回: 读取的字节数据
////////////////////////////////////////
uint8_t SPI_ReadByte(void)
{
SPI_SendData(0xff); //触发主机读取数据(主机发送时钟信号)
while (!SPI_CheckFlag()); //等待读取完成
SPI_ClearFlag(); //清除中断标志
return SPI_ReadData();
}
////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令
//<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_USBLIB_INITIAL_END>>
}
////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
WDT_Clear(); //清看门狗定时器 (防止硬件自动使能看门狗)
}
////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
if (bUsbOutReady) //查询是否有接收到USB主机发送数据
{
//<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
// 在此处添加用户处理接收数据的代码
if (UsbOutBuffer[0] == 1)
printf_usb("spi = %bX",spi);
else if (UsbOutBuffer[0] == 2)
printf_usb("China !\r\n");
//<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
usb_OUT_done(); //当前包的数据处理完成,通知USB主机可以发送下一包数据
}
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>