/*******************************************************
* INCLUDES
*******************************************************/
#include "hal_types.h"
#include "hal_spi.h"
#include "OSAL.h"
#include "OnBoard.h"
#include "hal_assert.h"
/******************************************************
* CONSTANTS
******************************************************/
/*
//control軟體控制
P1.4 - CS
//spi硬體控制
P1.5 - CLK
P1.6 - MOSI
P1.7 - MISO
*/
#define HAL_SPI_CS_PORT 1
#define HAL_SPI_CS_PIN 4
#define HAL_SPI_CLK_PORT 1
#define HAL_SPI_CLK_PIN 5
#define HAL_SPI_MOSI_PORT 1
#define HAL_SPI_MOSI_PIN 6
#define HAL_SPI_MISO_PORT 1
#define HAL_SPI_MISO_PIN 7
/**************************************************
* MACROS
**************************************************/
#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; )
#define HAL_CONFIG_IO_OUTPUT(port, pin, val) HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val)
#define HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \
P##port##_##pin## = val; \
P##port##DIR |= BV(pin); )
#define HAL_CONFIG_IO_PERIPHERAL(port, pin) HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin)
#define HAL_CONFIG_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BV(pin); )
/*******************************************************
* FUNCTIONS - API
*******************************************************/
void HalSpi_HW_Init(void);
void HalSpiInit(void)
{
HalSpi_HW_Init();
}
static void halSpi_ConfigSPI(void)
{
uint8 baud_exponent;
uint8 baud_mantissa;
PERCFG |= 0x02;
//設定硬體控制腳位
HAL_CONFIG_IO_PERIPHERAL(HAL_SPI_CLK_PORT, HAL_SPI_CLK_PIN);
HAL_CONFIG_IO_PERIPHERAL(HAL_SPI_MOSI_PORT, HAL_SPI_MOSI_PIN);
HAL_CONFIG_IO_PERIPHERAL(HAL_SPI_MISO_PORT, HAL_SPI_MISO_PIN);
//設定傳輸速度
baud_exponent = 10;
baud_mantissa = 0;
/* Configure SPI */
U1UCR = 0x80;
U1CSR = 0x00;
//U1GCR = HAL_SPI_TRANSFER_MSB_FIRST | HAL_SPI_CLOCK_PHA_0 | HAL_SPI_CLOCK_POL_LO | baud_exponent;//正緣觸發,正緣接收資料
U1GCR = HAL_SPI_TRANSFER_MSB_FIRST | 0x40 | HAL_SPI_CLOCK_POL_LO | baud_exponent;//正緣觸發,負緣接收資料
U1BAUD = baud_mantissa;
}
void HalSpi_HW_Init(void)
{
//設定基本output模式
HAL_CONFIG_IO_OUTPUT(HAL_SPI_CS_PORT, HAL_SPI_CS_PIN, 1);
halSpi_ConfigSPI();
}
static void spi_tx(uint8 x)
{
U1CSR &= ~((1<<2) | (1<<1));
U1DBUF = x;
while( !(U1CSR & (1<<1)) );
}
void HalSpi_Ad7763_Read(uint8 addr, uint8 *recv_data)
{
//將CS腳位到LOW
HAL_IO_SET(HAL_SPI_CS_PORT, HAL_SPI_CS_PIN, 0); //begin
addr &= 0x3f;//ADE7765讀取 8bit→0 7bit→0
spi_tx(addr);//傳送
spi_tx(0);
*recv_data = U1DBUF;//接收
spi_tx(0);
*(recv_data+1) = U1DBUF;
spi_tx(0);
*(recv_data+2) = U1DBUF;
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
//將CS腳位到HIGH
HAL_IO_SET(HAL_SPI_CS_PORT, HAL_SPI_CS_PIN, 1); //end
}
void HalSpi_Ad7763_Write(uint8 addr, uint16 send_data)
{
//將CS腳位到LOW
HAL_IO_SET(HAL_SPI_CS_PORT, HAL_SPI_CS_PIN, 0); //begin
addr |= 0x80;//ADE7765寫入 8bit→1 7bit→0
spi_tx(addr);
spi_tx((send_data&0xff00)>>8);
spi_tx(send_data&0x00ff);
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
//將CS腳位到HIGH
HAL_IO_SET(HAL_SPI_CS_PORT, HAL_SPI_CS_PIN, 1); //end
}
z-stack cc2530 SPI code
張貼者:
matttt
on 2012年1月17日
標籤:
Zstack
z-stack cc2530 SPI code:
0 意見:
張貼留言