Other Parts Discussed in Thread: C2000WARE
#include "uart2.h"
#include "lin.h"
//
// Configure the Baud Rate to 115.207kHz
//
uint32_t PRESCALER=0x0000035;
uint16_t DIVIDER=0x0004;
uint16_t rx_number = 0;
uint16_t vector_flg;
uint16_t RX2_Char ;
//
// Globals
//
uint16_t sData[8] ={0};
uint16_t rData[8]={0};
/*
//Place buffers in GSRAM
#pragma DATA_SECTION(sData, "ramgs0");
#pragma DATA_SECTION(rData, "ramgs0");
*/
volatile uint16_t done = 0; // Flag to set when all data transfered
void usart2_gpio_init(void)
{
// GPIO40 is the LIN Rx pin.
GPIO_setPinConfig(DEVICE_GPIO_CFG_LINRXB);
GPIO_setDirectionMode(DEVICE_GPIO_CFG_LINRXB, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(DEVICE_GPIO_CFG_LINRXB, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(DEVICE_GPIO_CFG_LINRXB, GPIO_QUAL_ASYNC);
// GPIO40 is the LIN Tx pin.
GPIO_setPinConfig(DEVICE_GPIO_CFG_LINTXB);//引脚功能
GPIO_setDirectionMode(DEVICE_GPIO_CFG_LINTXB, GPIO_DIR_MODE_OUT);//引脚方向
GPIO_setPadConfig(DEVICE_GPIO_CFG_LINTXB, GPIO_PIN_TYPE_STD);//引脚状态
GPIO_setQualificationMode(DEVICE_GPIO_CFG_LINTXB, GPIO_QUAL_ASYNC);//关闭同步
//LINB_功能定义
Interrupt_register(INT_LINB_0, &LIN_RX_data);//绑定中断服务函数
Interrupt_enable(INT_LINB_0);//使能LINB中断
LIN_initModule(LINB_BASE);//初始化LIN模块
configureSCIMode();//配置LINB模块为sci模式
LIN_enableGlobalInterrupt(LINB_BASE, LIN_INTERRUPT_LINE0);//启用LINB全局中断
LIN_clearGlobalInterruptStatus(LINB_BASE, LIN_INTERRUPT_LINE0);//清除全局中断标志位
}
//配置LINB为sci
void
configureSCIMode(void)
{
//
// Enter LIN reset state to perform configurations
//
LIN_enterSoftwareReset(LINB_BASE);
//
// Switch LIN into SCI mode
//
LIN_enableSCIMode(LINB_BASE);
//
// Set the SCI communication mode to idle line
//
LIN_setSCICommMode(LINB_BASE, LIN_COMM_SCI_IDLELINE);
//
// Set SCI to transmit one stop bit
//
LIN_setSCIStopBits(LINB_BASE,LIN_SCI_STOP_ONE);
//
// Disable parity check
//
LIN_disableSCIParity(LINB_BASE);
//
// Disable multi-buffer mode
//
LIN_disableMultibufferMode(LINB_BASE);
//
// Module set to complete operations when halted by debugger
//
LIN_setDebugSuspendMode(LINB_BASE, LIN_DEBUG_COMPLETE);
//
// Set character length as 8-bits
//
LIN_setSCICharLength(LINB_BASE, CHAR_LENGTH);
//
// Set to 1 character in response field
//
LIN_setSCIFrameLength(LINB_BASE, FRAME_LENGTH);
LIN_disableIntLoopback(LINB_BASE);
LIN_disableExtLoopback(LINB_BASE);
//LIN_enableExtLoopback(LINB_BASE, LIN_LOOPBACK_ANALOG,
// LIN_ANALOG_LOOP_TX);
LIN_setBaudRatePrescaler(LINB_BASE, PRESCALER, DIVIDER);
//
// Enable interrupt for when a frame has been completely received
//
LIN_enableSCIInterrupt(LINB_BASE, LIN_SCI_INT_RX);
//
// Set the interrupt priority to line 0 (high)
//
LIN_setSCIInterruptLevel0(LINB_BASE, LIN_SCI_INT_RX);
//
// Exit LIN reset state
//
LIN_exitSoftwareReset(LINB_BASE);
}
__interrupt void LIN_RX_data(void)
{
vector_flg = 1;
RX2_Char = LIN_readSCICharBlocking(LINB_BASE,true);
//get_LINB_data(LINB_BASE,rData,8);
if(rx_number<8)
{
rData[rx_number]=RX2_Char;
}
else
{
rx_number = 0;
vector_flg = 0;
}
rx_number++;
LIN_clearInterruptStatus(LINB_BASE, LIN_INT_RX);
LIN_clearGlobalInterruptStatus(LINB_BASE, LIN_INTERRUPT_LINE0);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
}
void LIN_sendData12(uint32_t base, uint16_t data)
{
if(vector_flg != 1)
{
LIN_writeSCICharBlocking(base,data);
}
}
参考的例程为:Ti\C2000Ware_6_00_00_00\driverlib\f28002x\examples\lin\lin_ex2_sci_loopback.c
不知道是不是因为配置导致的,目前该配置只能接收数据,无法发送数据
还是因为发送函数写的不对,请指导一下