blob: 00e7dc9b075c32305a376c9039437579bca567a4 [file] [log] [blame]
Parker Schuhd3b7a8872018-02-19 16:42:27 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) FIRST 2008-2017. All Rights Reserved. */
3/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
Austin Schuhf6b94632019-02-02 22:11:27 -08008#include "hal/SPI.h"
Parker Schuhd3b7a8872018-02-19 16:42:27 -08009#include "frc971/wpilib/ahal/SPI.h"
10
11#include <cstring>
12
Austin Schuhf6b94632019-02-02 22:11:27 -080013#include "hal/HAL.h"
14#include "wpi/SmallVector.h"
Parker Schuhd3b7a8872018-02-19 16:42:27 -080015
16using namespace frc;
17
18#define HAL_FATAL_WITH_STATUS(status)
19
Parker Schuhd3b7a8872018-02-19 16:42:27 -080020SPI::SPI(Port SPIport) {
21#ifdef WPILIB2017
22 m_port = SPIport;
23#else
24 m_port = static_cast<HAL_SPIPort>(SPIport);
25#endif
26 int32_t status = 0;
27 HAL_InitializeSPI(m_port, &status);
28 HAL_FATAL_WITH_STATUS(status);
29
30 static int instances = 0;
31 instances++;
32 HAL_Report(HALUsageReporting::kResourceType_SPI, instances);
33}
34
Parker Schuhd3b7a8872018-02-19 16:42:27 -080035SPI::~SPI() { HAL_CloseSPI(m_port); }
36
Parker Schuhd3b7a8872018-02-19 16:42:27 -080037void SPI::SetClockRate(double hz) { HAL_SetSPISpeed(m_port, hz); }
38
Parker Schuhd3b7a8872018-02-19 16:42:27 -080039void SPI::SetMSBFirst() {
40 m_msbFirst = true;
41 HAL_SetSPIOpts(m_port, m_msbFirst, m_sampleOnTrailing, m_clk_idle_high);
42}
43
Parker Schuhd3b7a8872018-02-19 16:42:27 -080044void SPI::SetLSBFirst() {
45 m_msbFirst = false;
46 HAL_SetSPIOpts(m_port, m_msbFirst, m_sampleOnTrailing, m_clk_idle_high);
47}
48
Parker Schuhd3b7a8872018-02-19 16:42:27 -080049void SPI::SetSampleDataOnFalling() {
50 m_sampleOnTrailing = true;
51 HAL_SetSPIOpts(m_port, m_msbFirst, m_sampleOnTrailing, m_clk_idle_high);
52}
53
Parker Schuhd3b7a8872018-02-19 16:42:27 -080054void SPI::SetSampleDataOnRising() {
55 m_sampleOnTrailing = false;
56 HAL_SetSPIOpts(m_port, m_msbFirst, m_sampleOnTrailing, m_clk_idle_high);
57}
58
Parker Schuhd3b7a8872018-02-19 16:42:27 -080059void SPI::SetClockActiveLow() {
60 m_clk_idle_high = true;
61 HAL_SetSPIOpts(m_port, m_msbFirst, m_sampleOnTrailing, m_clk_idle_high);
62}
63
Parker Schuhd3b7a8872018-02-19 16:42:27 -080064void SPI::SetClockActiveHigh() {
65 m_clk_idle_high = false;
66 HAL_SetSPIOpts(m_port, m_msbFirst, m_sampleOnTrailing, m_clk_idle_high);
67}
68
Parker Schuhd3b7a8872018-02-19 16:42:27 -080069void SPI::SetChipSelectActiveHigh() {
70 int32_t status = 0;
71 HAL_SetSPIChipSelectActiveHigh(m_port, &status);
72 HAL_FATAL_WITH_STATUS(status);
73}
74
Parker Schuhd3b7a8872018-02-19 16:42:27 -080075void SPI::SetChipSelectActiveLow() {
76 int32_t status = 0;
77 HAL_SetSPIChipSelectActiveLow(m_port, &status);
78 HAL_FATAL_WITH_STATUS(status);
79}
80
Parker Schuhd3b7a8872018-02-19 16:42:27 -080081int SPI::Write(uint8_t *data, int size) {
82 int retVal = 0;
83 retVal = HAL_WriteSPI(m_port, data, size);
84 return retVal;
85}
86
Parker Schuhd3b7a8872018-02-19 16:42:27 -080087int SPI::Read(bool initiate, uint8_t *dataReceived, int size) {
88 int retVal = 0;
89 if (initiate) {
Austin Schuhf6b94632019-02-02 22:11:27 -080090 wpi::SmallVector<uint8_t, 32> dataToSend;
Parker Schuhd3b7a8872018-02-19 16:42:27 -080091 dataToSend.resize(size);
92 retVal = HAL_TransactionSPI(m_port, dataToSend.data(), dataReceived, size);
93 } else {
94 retVal = HAL_ReadSPI(m_port, dataReceived, size);
95 }
96 return retVal;
97}
98
Parker Schuhd3b7a8872018-02-19 16:42:27 -080099int SPI::Transaction(uint8_t *dataToSend, uint8_t *dataReceived, int size) {
100 int retVal = 0;
101 retVal = HAL_TransactionSPI(m_port, dataToSend, dataReceived, size);
102 return retVal;
103}