📄 twimain._c
字号:
/*函数的使用说明:
1.该twi模块包含四种工作模式,主发,主收,从收,从发,其中主发由
twiWriteByte(从机地址,要发送的数据)实现,主收由twiReadByte(从机地址)实现,从机
的发送与接收均通过中断实现
2.在从机模式下,需调用twi_init()来使能并初始化twi总线
3.在主机模式下,调用twiWriteByte(从机地址,要发送的数据)向指定的从机写入数据,
调用twiReadByte(从机地址)从指定的从机读取数据,然后可通过查询错误状态error_state
的值决定下一步如何操作。
*/
#include "twi.h"
//TWI同程序的接口参数
//receive_data,error_state不用设置
char receive_data=0; // 接收到的数据
char error_state=0; // twi错误状态
//以下三个参数根据需求进行设置
char slave_address=0xa0; // 设置从机地址,Bits 7..1:存放从机地址,Bit 0:最低位为广播识别使能位
char bit_race=0x20; // 设置主机模式的比特率,SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置
char send_data=0x02; // 从机发送模式下从机向主机发送的数据
//要发送的数据
char trandata[num] = {0x00,0x01,0x02,0x03};
//*************************PTR8000全局变量**********************************
unsigned char Recv;
unsigned char RC0 = 0x4c,RC1 = 0x0c;//用于设置发送频率
unsigned char Add = 0xa1; //设置发送地址
//*************************** twi错误状态说明*********************************
// 0:twi传送无错误
// 1:在主发模式下,SLA+W已发送,返回NOT ACK
// 2:在主发模式下,DATA已发送,返回NOT ACK
// 3:在主发模式下,SLA+W或者数据的仲裁失败
// 4:在主收模式下,SLA+R或者数据的仲裁失败
// 5:在主收模式下,SLA+R已发送,返回NOT ACK
// 6:在主发模式下,START信号发送不成功
// 7:在主收模式下,START信号发送不成功
// 8:在主收模式下,数据接受完成
// 9:在主收模式下,数据接受不成功
//*****************************************************************************
//*************************函数定义部分**************************************
void port_init(void); //初始化MEGA各控制引脚
void Delay_1ms(void); //延时1ms函数
void Delay_Nms(unsigned int N); //延时Nms函数
void LED(unsigned char i); //点亮/熄灭LED
//串口通讯用函数
void Uart_Init(void); //UART初始化
void Uart_Send(unsigned char c); //UART发送一个字符
//SPI通讯用函数
void SPI_MasterInit(void); //SPI主机初始化
void SPI_M_Send(unsigned char c); //主机方式发送一个字符
unsigned char SPI_M_Recv(unsigned char c); //主机接收一个字符
//PTR8000用函数
void PTR8_Standby(void); //set TRC_CE Disable
void PTR8_TREN(void); //set TRX_CE Enable
void PTR8_TX(void); //无线模块发送状态
void PTR8_RX(void); //无线模块接收状态
void Init_PTR8_CR(void); //初始化PTR8000控制状态
void Init_Device(void); //初始化串口、SPI口及其他设备
//******************************函数实现部分************************************
//*************************** I/O 初始化****************************************
//******************************************************************************
/* 函数名: init_port
功能说明:初始化各MEGA8各控制引脚
参数说明:无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-23
修改时间:
修改内容: */
void port_init(void)
{
PORTB = 0x2f; //置PB0,PB1,PB2,PB3,PB5为1,PB4,PB6,PB7为0
DDRB = 0x2f; //置PB0,PB1,PB2--SS,PB3--MOSI,PB5--SCK为输出,PB4--MISO为输入
PORTC = 0x0f;
DDRC = 0x0f; //PC4--SDA,PC5--SCL为输入,PC0--PC3全为输出以便测试
PORTD = 0x05; //置PWR,TXEN为1, TRXCE为0
DDRD = 0x07; //置PD3,PD4,PD5输入;PD2--PWR,PD0--TXEN,PD1--TRXCE输出
}
//**************************************************************************************
/* 函数名: Delay_1ms
功能说明:软件延时1ms
参数说明:无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-06
修改时间:
修改内容: */
void Delay_1ms(void)
{
unsigned int i;
for ( i = 0 ; i < ( unsigned int ) 11 * 143 - 2 ; i ++ )
;
}
//******************************************************************
/* 函数名: Delay_Nms
功能说明:软件延时Nms,适用于所有CPU
参数说明:N值决定延时长度。范围为0~65536之间的整数
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-06
修改时间:
修改内容: */
void Delay_Nms(unsigned int N)
{
unsigned int j;
for( j = 0 ; j < N ; j ++ )
Delay_1ms();
}
//*******************************************************************
/* 函数名: LED
功能说明:点亮/熄灭LED
参数说明:0----点亮;1----熄灭
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-23
修改时间:
修改内容: */
void LED(unsigned char i)
{
if(i == 0)
PORTB &= ~BIT(PB1);
else
PORTB |= BIT(PB1);
}
//*******************************************************************
//串口通讯用函数
/* 函数名: Uart_Init
功能说明:串口初始化函数,适用于所有CPU
波特率9600,8位字节,无奇偶校验
参数说明:无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-02
修改时间:
修改内容: */
void Uart_Init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86;
UBRRL = 0x47; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}
//********************************************************************
/* 函数名: Uart_Send
功能说明:通过查询方式,串口发送一个字节函数,适用于所有CPU
参数说明:c为所要发送的字节
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-02
修改时间:
修改内容: */
void Uart_Send(unsigned char c)
{
while(!(UCSRA&(1<<UDRE)))
; //等待空闲
UDR=c; //发送数据
}
/*接收中断函数*/
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
Recv = UDR;
Uart_Send(Recv);//接收到的数据立即通过串口返回
}
//**********************************************************************
//SPI通讯用函数
/* 函数名: SPI_MasterInit
功能说明:SPI主机初始化函数。使能SPI,MSB在前,主模式
起始上升沿,采样上升沿。16分频
参数说明: 无
返回值: 无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-02
修改时间:
修改内容: */
void SPI_MasterInit(void)
{
SPCR = 0x51; //SPI控制寄存器初始化:SPI允许,MSB先发,主模式,16分频
}
//**********************************************************************
/* 函数名: SPI_M_Send
功能说明:SPI主机发送一个字节函数。
参数说明: c为要发送的字节
返回值: 无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-02
修改时间:2005-12-05
修改内容: 去掉SS信号控制语句 */
void SPI_M_Send(unsigned char c)
{
SPDR = c; //传送开始
while(!(SPSR & 0X80))
; //查询SPIF标志
}
//************************************************************************
/* 函数名: SPI_M_Recv
功能说明:SPI主机方式接收一个字节函数。
参数说明:任意无效字符
返回值: 返回接收到的字节
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-06
修改时间:
修改内容: */
unsigned char SPI_M_Recv(unsigned char c)
{
SPDR = c; //传送开始
while(!(SPSR & 0X80))
; //查询SPIF标志
return SPDR; //返回接收的字符
}
//*************************************************************************
//***************************PTR8000无线模块用函数*****************
/* 函数名: PTR8_Standby
功能说明:将PTR8置为待机状态。SET TRX_CE = 0
参数说明:无
返回值: 无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-23
修改时间:
修改内容: */
void PTR8_Standby(void)
{
PORTD &= ~BIT(PD1); //TRX_CE = 0
}
//**************************************************************************
/* 函数名: PTR8_TREN
功能说明:将PTR8置为工作状态。SET TRX_CE = 1
参数说明:无
返回值: 无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-23
修改时间:
修改内容: */
void PTR8_TREN(void)
{
PORTD |= BIT(PD1); //TRX_CE = 1
}
//***************************************************************************
/* 函数名: PTR8_TX
功能说明:将PTR8置为发送状态。
参数说明:无
返回值: 无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-23
修改时间:
修改内容: */
void PTR8_TX(void)
{
PORTD |= BIT(PD0); //TX_EN = 1
}
//***************************************************************************
/* 函数名: PTR8_RX
功能说明:将PTR8置为接收状态。
参数说明:无
返回值: 无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-23
修改时间:
修改内容: */
void PTR8_RX(void)
{
PORTD &= ~BIT(PD0); //TX_EN = 0
}
//*****************************************************************************
void Init_PTR8_CR(void)
{
PORTB &= ~BIT(PB2); //SS SET LOW, Write Configuration register Start
SPI_M_Send(WC); //Wirte Configuration Register,Start From 0000
SPI_M_Send(RC0); //Write CH_NO [7 : 0]
SPI_M_Send(RC1); //Write Byte 2
SPI_M_Send(0x44);
SPI_M_Send(0x01); //RX payload = 1 byte
SPI_M_Send(0x01); //TX payload = 1 byte
SPI_M_Send(Add);
SPI_M_Send(Add);
SPI_M_Send(Add);
SPI_M_Send(Add);
SPI_M_Send(0x58);
PORTB |= BIT(PB2); //SS set HIGH,Write Configuration Register Finish
}
//************************************************************************************
/* 函数名: Init_Device
功能说明:初始化设备。LED亮一下,蜂鸣器叫一声,初始化串口
参数说明:无
返回值: 无
函数作者:Haibo YU
版本号: 1.0
创建时间:2005-12-23
修改时间:
修改内容: */
void Init_Device(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init(); //初始化各控制端口
Uart_Init(); //串口初始化
SPI_MasterInit();//SPI Master Init
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
//****************************** 主函数 ***************************************
//******************************************************************************
void main(void)
{
unsigned char dr;
Init_Device(); //Init All Device
Init_PTR8_CR(); //Set Configuration register
Delay_1ms();
PTR8_RX(); //Set RX mode
PTR8_TREN(); // TRX_CE = 1 Enable RX
Delay_1ms();
while(1)
{
dr = (PINC & 0x04);
if(dr != 0) //DR置位,无线数据接收成功
{
PTR8_Standby(); //TRX_CE = 0,disable RX
Delay_1ms();
PORTB &= ~BIT(PB2); //SS = 0
SPI_M_Send(RRP); //Read RX payload
Recv = SPI_M_Recv(0xff);
PORTB |= BIT(PB2); //SS = 1
/* if(Recv == 0)
{
LED(0); //接收到0 LED亮
Delay_Nms(1000);
}
else
{
LED(1);//接收到1 LED灭
Delay_Nms(1000);
}*/
PTR8_RX(); //Set RX mode
PTR8_TREN(); // TRX_CE = 1 Enable RX
Delay_1ms();
twiWriteByte(0xc0,Recv);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -